1. ホーム
  2. android

[解決済み] Androidです。ダイアログのテキストを編集してもソフトキーボードが表示されない

2023-05-11 13:49:24

質問

よくある問題と思われるのですが、ダイアログボックスの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のように動作し、不具合や回避策は必要ありません。