[解決済み] Androidです。ダイアログのテキストを編集してもソフトキーボードが表示されない
質問
よくある問題と思われるのですが、ダイアログボックスのEditTextにフォーカスが当たったときに表示されないということがあります。いくつかの回避策を見たことがありますが、たとえば、次のようなものです。 このスレッド , このスレッド そして これ (などなど)、しかし なぜ を説明する納得のいく説明を見たことがありません。
私は、独自に構築するよりも、アンドロイドがEditTextsのために独自のデフォルトの動作を使用することをはるかに好みますが、(これらのスレッドで)誰もが、ダイアログ内のEditTextsのデフォルトの動作は、カーソルだけを与えてキーボードがないことを受け入れたように思われます。なぜそうなるのでしょうか?
ちなみに、これらの回避策はどれも私には効果がないようです。最も近かったのは、キーボードを強制的に表示させる の下に の下にキーボードを強制的に表示させる (InputMethodManager.toggleSoftKeyboard(*) を使用) ことです。私の特定の構成はAPI15で、AlertDialog内のListViewのフッターにEditTextが表示されます。EditText android:focusable="true" が設定され、onFocusChangeListenerが設定されています。 は がフォーカスイベントを受信しています。
編集する。
要求されたように、私が作業している特定のコードスニペットを以下に示します。全体のレイアウトは気にしませんが、この特定のアプリケーションでは、ダイアログのボタンを押すと、EditText が表示されます (同様のものとして アクションビュー ). これは、デフォルトで可視性 "gone" を持つ 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のvisibilityを"Visible"に設定します(そして他のUI要素を非表示にします)。これは は は、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."));
}
}
});
この構成で、私が まず を入力すると、onFocusChangedListener がトリガーして、必ず次のようなログが生成されます。
Focus requested, has focus.
Focus requested, doesn't have focus.
Focus requested, has focus.
キーボードは2回トグルするためか、表示されたり消えたりしますが、表示されたままであることを確認しても の後ろに の後ろ (灰色の領域) にあり、ダイアログを閉じなければキーボードに到達する方法がありません。
とはいえ、このワークアラウンドがうまくいくかもしれないとしても、私は強調したいのは
主に興味があるのは
を見つけることに興味があります。 なぜ がトリガーされない単純な理由、およびこれが非常に一般的であると思われる理由を見つけることです。どのように解決するのですか?
OK、それで、たくさん読んだ後、私はなぜこれが問題なのかを理解しました、そして、私は行います ではなく は回避策を使用する必要があります。
問題は (少なくとも私の場合)、テキストを入力する場所が最初は隠されているので (またはネストされているか何か)、AlertDialog が自動的に WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM (またはそれと WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE のいくつかの組み合わせ) を設定して、ソフト入力が表示されないような状況を引き起こすことらしいのですが、このフラグを設定すると、AlertDialog はそのように表示するようになるのでしょうか?
私が見つけたこれを修正する方法は、ダイアログが作成された後に次の行を追加することです。
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
一旦これが行われると、EditTextは通常のEditTextのように動作し、不具合や回避策は必要ありません。
関連
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] AndroidでEditTextのテキスト長を制限する最も良い方法は何ですか?
-
[解決済み] 編集テキストをクリックした後、ソフトキーボードを隠すには?
-
[解決済み] Android: EditTextにフォーカスがあるとき、自動的にソフトキーボードを表示する
-
[解決済み】編集テキストにフォーカスが当たっている時にソフトキーボードを表示させる方法
-
[解決済み] getApplication()、getApplicationContext()、getBaseContext()、someClass.thisの違いと使い分け。
-
[解決済み] DialogFragmentを正しく終了させるには?
-
[解決済み] Android: xml リソースからの整数値
-
[解決済み] ViewPager2でスワイプを無効にするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Android: EditTextにフォーカスがあるとき、自動的にソフトキーボードを表示する
-
[解決済み] Eclipseでのandroid:configChangesでのAdmobエラー
-
[解決済み] Androidでマイナスマージンを使用するのは悪いことですか?
-
[解決済み] onCreate(Bundle savedInstanceState)とは?
-
[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
-
[解決済み] Android StudioからADBを手動で再起動する方法
-
[解決済み] Android端末がHDPI画面かMDPI画面かを確認する方法は?
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] BottomNavigationViewを新しいNavControllerで使用する際に、フラグメントを生かす方法はありますか?
-
[解決済み] Android APKファイルの中身を見るには?