web-dev-qa-db-ja.com

Androidアジャストパンが最初から機能しない

私の問題:ソフトウェアキーボードが画面に表示された2回目から、EditTextが完全に非表示になります。

属性Android:windowSoftInputMode = "adjustPan"はAndroidManifest.xmlで指定されていますが、最初にのみ機能します。

次のレイアウトがあります。

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="464dp"
        Android:gravity="top"
        Android:orientation="vertical"
        Android:paddingLeft="16dp"
        Android:paddingRight="16dp" >

        <ListView
            Android:id="@+id/list"
            Android:layout_width="match_parent"
            Android:layout_height="0dp"
            Android:layout_weight="10"
            Android:background="#E3E3E2"
            Android:gravity="top" />

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:orientation="horizontal" >

            <EditText
                Android:id="@+id/addListText"
                Android:layout_width="0dp"
                Android:layout_height="48dp"
                Android:layout_weight="10"
                Android:contentDescription="@string/addItemContentDescription"
                Android:gravity="bottom|center_horizontal"
                Android:inputType="textLongMessage"
                Android:textColor="#E3E3E2"
                Android:visibility="gone" />

            <ImageButton
                Android:id="@+id/addTextListButton"
                Android:layout_width="0dp"
                Android:layout_height="48dp"
                Android:layout_weight="1"
                Android:layout_gravity="right"
                Android:background="@Android:color/transparent"
                Android:contentDescription="@string/addItemButton"
                Android:scaleType="fitCenter"
                Android:src="@drawable/plus_add"
                Android:visibility="gone" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="fill_parent"
        Android:gravity="bottom|center_horizontal"
        Android:orientation="horizontal"
        Android:paddingLeft="16dp"
        Android:paddingRight="16dp" >

        <ImageButton
            Android:id="@+id/syncListsButton"
            Android:layout_width="64dp"
            Android:layout_height="match_parent"
            Android:src="@Android:drawable/ic_popup_sync" />

        <ImageButton
            Android:id="@+id/showOrHide"
            Android:layout_width="64dp"
            Android:layout_height="match_parent" />

        <ImageButton
            Android:id="@+id/delListButton"
            Android:layout_width="64dp"
            Android:layout_height="match_parent"
            Android:src="@Android:drawable/ic_menu_delete" />
    </LinearLayout>
</LinearLayout>

「showOrHide」ボタンは、「addListText」/「addTextListButton」コンボの表示/非表示を切り替えます。

EditTextが初めて表示されてタッチすると、ソフトキーボードが画面に表示され、「addListText」/「addTextListButton」のコンボが正しくパンされます。キーボードを非表示にしてからもう一度表示すると、キーボードがaddListText編集ボックスを完全に覆います。

何が起こっているかについて何か考えはありますか? Android 4.2.2。

助けてください!ありがとう:-)

編集:最初のLinearLayoutをScrollView内に配置しようとしましたが、機能しません!

41
bilbo20

editTextをサブクラス化し、メソッドonKeyPreIme(int keyCode、KeyEvent event)を次のようにオーバーライドしました。

   @Override
   public boolean onKeyPreIme(int keyCode, KeyEvent event)
   {
      if(keyCode == KeyEvent.KEYCODE_BACK)
        {
            clearFocus();
        }
   return super.onKeyPreIme(keyCode, event);
   }

これで、戻るキーが押されると、EditTextはフォーカスを失いました。次に、もう一度タップして調整パンが機能します。

53
Chirag Shah

これは少しばかげているように見えるかもしれませんが、EditTextのプロパティGravityを「center_horizo​​ntal」または「center」に設定すると、この問題に遭遇しました。同じ問題がtextAlignment 'center'を使用するときに発生します。それを削除すれば、キーボードが出てきたときにキーボードがEditTextを2回目(およびそれ以降)隠すという問題に遭遇することはありません。

81
dbar

発生している問題は、ここで説明するように、プラットフォームの既知のバグです https://code.google.com/p/Android/issues/detail?id=182191

この修正はバックポートされないため、Android N。Android Nが最小のSDKになるまでは、次の解決策が回避策となります。

EditTextを拡張するカスタムクラスを作成し、次のようにメソッドonKeyPreIme(int keyCode、KeyEvent event)をオーバーライドできます。

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event)
{
   if(keyCode == KeyEvent.KEYCODE_BACK)
     {
         clearFocus();
     }
return super.onKeyPreIme(keyCode, event);
}

また、EditTextのフォーカスが正常にクリアされるように、上位レベルのレイアウトにフォーカスできるようにする必要があります。次の属性はあなたのために働くかもしれません:

Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true"

これで、戻るキーが押されると、EditTextはフォーカスを失います。その後、もう一度ボタンをタップすると、調整パンが意図したとおりに機能します。 (編集が拒否されたため、回答として投稿します。)

9
colintheshots

これが私が最初に使用したコードで、この問題に遭遇しました:

    <EditText
        Android:layout_width="250dp"
        Android:layout_height="wrap_content"
        Android:gravity="center" />

EditTextから中心重力線を削除すると、パンが機能しました。

Android:gravity="center"

EditTextをFrameLayoutでラップし、EditText全体をFrameLayoutの中央に配置することで、これを回避しました。これが引き起こす1つの問題は、EditTextが少なくともヒントテキストの幅になるため、入力された最初の数文字/単語が中央揃えにならないことです。これは私にとっては問題ありませんでしたが、あなたの走行距離は異なる場合があります:)

<FrameLayout
    Android:layout_width="250dp"
    Android:layout_height="wrap_content">

    <EditText
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center" />
</FrameLayout>

編集:この回避策は、ユーザーがedittextの最後のWordをクリックしている場合に機能しなくなります。現在、onKeyPreImeの回避策を使用しています

1
Mihai

私にとって、onKeyPreImeのオーバーライドは機能しません。したがって、代わりにdispatchKeyEventPreImeをオーバーライドします。

@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
    if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){
     clearFocus();
    }
    return super.dispatchKeyEventPreIme(event);
}

マニフェストファイルで多くの解決策を試した後、私はそれを以下で解決しました、相対レイアウトでのadjustPanは機能しません、

親レイアウトはLinearLayoutである必要があります

これが人々の時間を節約することを願っています。

0
Rishabh Dugar

通常、[戻る]ボタンを押して次のようにしようとすると、最初に調整パンが機能しません。

 @Override
    public void onBackPressed() {
        editText.clearFocus();
        editText.setCursorVisible(false);
    }

それが誰かを助けることを願って

0
cammando

EditTextでAndroid:layout_gravity="center"このタイプの問題を作成します。あなたがテキストを中央にしたいなら、あなたはこのようにすることができます

ステップ1:レイアウト用

 <LinearLayout
                Android:id="@+id/linerPassword"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_toRightOf="@+id/imageView2"
                Android:gravity="center">

                <EditText
                    Android:id="@+id/editText2"
                    Android:layout_width="wrap_content"
                    Android:layout_height="40dp"
                    Android:background="@null"
                    Android:hint="*****"
                    Android:layout_marginLeft="-40dp"
                    Android:paddingLeft="10dp"
                    Android:paddingRight="10dp"
                    Android:inputType="textPassword"
                    Android:textColor="@color/white"
                    Android:textColorHint="@color/white"
                    Android:textSize="18sp" />
            </LinearLayout>

ステップ2:プログラムによるいくつかのこと

 linerUser.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(mETUserName, 0);
            mETUserName.requestFocus();    
        }
    });

最後に非常にうまくいきます。私はsoftKeyboardを調整するためのこの解決策を見つけました

0
Binesh Kumar