そのため、一般的な問題と思われる問題が発生しました。これは、ダイアログボックスのEditTextがフォーカスされたときに表示されないことです。このスレッド、これ、これ(およびその他多数)など、いくつかの回避策を見てきましたが、そもそもなぜこれが起こっているのかについて満足のいく説明を見たことがありません。
自分でビルドするよりも、AndroidでEditTextsのデフォルトの動作を使用する方がはるかに好きですが、(これらのスレッドの)誰もが、ダイアログのEditTextsのデフォルトの動作はカーソルを指定するだけでキーボードを使用しないことを受け入れているようです。なぜそうなるのでしょうか?
ちなみに、これらの回避策はどれも私にはうまくいかないようです-私が到達できた最も近い方法は、ダイアログボックスの下にキーボードを強制的に表示することです(InputMethodManager.toggleSoftKeyboard(*)を使用)。私の特定の構成はAPI15で、EditTextはAlertDialog内のListViewのフッターに表示されます。EditText android:focusable = "true"が設定され、onFocusChangeListenerがフォーカスイベントを受信しています。
編集:
リクエストに応じて、これが私が使用している特定のコードスニペットです。レイアウト全体を気にする必要はありませんが、この特定のアプリケーションでは、ダイアログのボタンを押すとEditTextが表示されます(アクションビューと同様)。これは、デフォルトで可視性が「なくなった」RelativeLayoutに含まれています。
<RelativeLayout
android:id="@+id/relLay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:visibility="gone"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp">
<ImageButton
android:id="@+id/cancelBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@color/transparent"
android:src="@drawable/cancelButton"
android:layout_margin="5dp"/>
<ImageButton
android:id="@+id/okBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/cancelBut"
android:background="@color/transparent"
android:src="@drawable/okButton"
android:layout_margin="5dp" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:focusable="true"
android:layout_toLeftOf="@id/okBut"/>
</RelativeLayout>
これを構築するコードは、relativeLayoutの可視性を「Visible」に設定します(そして他のUI要素を非表示にします)。EditTextでの私の経験に基づくと、これはEditTextがフォーカスされたときにキーボードを引き上げるのに十分なはずです。ただし、何らかの理由でこれは当てはまりません。次のonFocusChangeListenerを設定できます。
edit_text.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// For whatever reason we need to request a soft keyboard.
InputMethodManager imm = (InputMethodManager)dlg.getWindow().getContext().getSystemService(_Context.INPUT_METHOD_SERVICE);
if(hasFocus)
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Log.v("DialogProblem", "Focus requested, " + (hasFocus?"has focus.":"doesn't have focus."));
}
}
});
この構成を使用して、最初にEditTextを入力すると、onFocusChangedListenerがトリガーされ、常に次のようなログが生成されます。
Focus requested, has focus.
Focus requested, doesn't have focus.
Focus requested, has focus.
キーボードが表示されてから消えるのは、おそらく2回切り替えたためですが、キーボードが上がったままであることを確認しても、ダイアログウィンドウの後ろ(灰色の領域)にあり、ダイアログを閉じずにキーボードにアクセスする方法はありません。 。
とはいえ、この回避策を機能させることはできるかもしれませんが、EditTextが最初にトリガーされない単純な理由と、これがなぜ発生するのかを見つけることに主に関心があることを強調したいと思います。当たり前のようです!