web-dev-qa-db-ja.com

Android 4.xを押すと、リストビューのEditTextがフォーカスを失います

ここには似たような質問がたくさんありますが、提供されているソリューションをシンプルなサンプルアプリで動作させることはできませんでした。

問題はsoftkeyboardが初めて表示されるときに発生します。表示されたらすぐにeditTextをもう一度押すだけで編集可能になります。

以下を試しました:

_ Android:windowSoftInputMode="adjustPan|adjustResize"
_

これは問題を解決していません。この行は、ソフトキーボードがポップアップした後にアクティビティのサイズを変更するために必須のようです。残念ながら、これはEditTextsがフォーカスを失う原因にもなります。これはおそらくListView自体がサイズ変更プロセスの後にフォーカスを得ているためです。そこで、次の回避策を試しました。

_ listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
_

これにより、常に最初の可視のEditTextListViewに含まれるため、フォーカスを取得しますが、これは望ましくありません。代わりに、2行目の2番目のEditTextが押されたときにフォーカスを取得する必要があります。また、最終的に最初の表示以外の別のEditTextにフォーカスすることができた場合(たとえば、softkeyboardで「次へ」を押すことにより)、キーボードが閉じられ、ListViewがサイズ変更された後に最初に表示されるものがフォーカスを取得します再びそのフルサイズ。

ListViewのonFocusChange()イベントをインターセプトするなど、TouchListenerによって押されたEditTextを把握しながら、他のいくつかのことを試しました。その特定のEditTextのフォーカスを再度要求しても、成功することはありませんでした。

他のユーザーによって提案されたScrollViewの代わりにListViewを使用することは、関係するプロジェクトにとっても選択肢ではありません。

63
Display name

このような状況の古典的なハックは、ハンドラーとpostDelayed()を使用することです。アダプタで:

private int lastFocussedPosition = -1;
private Handler handler = new Handler();

public View getView(final int position, View convertView, ViewGroup parent) {

    // ...

    edittext.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                handler.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        if (lastFocussedPosition == -1 || lastFocussedPosition == position) {
                            lastFocussedPosition = position;
                            edittext.requestFocus();
                        }
                    }
                }, 200);

            } else {
                lastFocussedPosition = -1;
            }
        }
    });

    return convertView;
}

これは私のデバイス上で動作しますが、このコードは本番環境から外してください。 AndroidバージョンまたはROMごとにフォーカスバグが異なる形で現れる場合でも、私は驚かないでしょう。

EditText内にListViewを埋め込むことには、ハックのような解決策がある他の多くの問題もあります。すべての otherpeople もがきを参照してください。

このようなことが起こるのも非常に簡単です:

like this

私が何度も同じようなパスをたどった後、デフォルトのキーボードの動作や癖をオーバーライドしようとすることをほとんどあきらめました。可能であれば、アプリで代替ソリューションを見つけることをお勧めします。

ListView行をスタイル付きTextViewにして、行がクリックされたときにDialogとともにEditTextを表示し、TextViewを必要?

42
Kyle Ivey

ListViewの行内にあるEditTextを押したときに、ActionBarの「スチール」フォーカスで問題が発生していました。上記の解決策は機能しませんでしたが、次の解決策はうまくいきました。

http://www.mysamplecode.com/2013/02/Android-edittext-listview-loses-focus.html

基本的に、これをリストビューに追加しました:

Android:descendantFocusability="beforeDescendants"

これを私のアクティビティに追加しました:

Android:windowSoftInputMode="adjustPan"
39
gonzobrains

マニフェストxmlを変更して、アクティビティにwindowSoftInputModeを追加します。

<activity
    Android:name=".YourActivity"
    Android:windowSoftInputMode="adjustPan">
</activity>
19
nlmm01

私は非常に古いスレッドを知っていますが、この答えは誰かに役立つかもしれませんので、ここにあります:

RecyclerViewに切り替えると、ListViewのこれらの迷惑な問題を心配する必要がなくなります。新しいビューを作成する代わりに、古いビューをリサイクルして再利用します。

8
ShahrozKhan91

私はrecyclerViewで同じ問題を抱えていて、提案されたすべての解決策を試していました。

最後に、私の場合の問題は、recyclerViewが誤ってXMLの高さの値としてwrap_contentを持っていることでした。 match_parentに変更し、期待どおりに動作を開始しました。focusable値が設定されておらず、Android:windowSoftInputMode="adjustResize"を使用しています

2
Omer

リストがソフトキーボードをカバーするのに十分な長さである場合、EditTextListviewは、Android 4.x.

1つの解決策は、Listviewを画面の半分の高さの線形レイアウトでラップすることです。

Listviewがソフトキーボードをカバーしていないときはいつでも、すべてが問題ありません。

1
Kai Wang

リサイクラービューを使用すると、リストとグリッドビューのいくつかの問題が解決します。 Yoは、スタッガードグリッドビューでも動作できます。 Yoはこれで簡単に作業を開始できます http://Android-er.blogspot.com.co/2015/07/staggeredgridlayoutmanager-google-app.html

1
user1176776

私の場合、アダプターにローカル値currentFocusedRowを追加しました。メソッドgetView()で、各editTextにこれらのコードを追加しました。

   if (currentlyFocusedRow == position) {
        editText.requestFocus();
   }

        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    if (currentlyFocusedRow == -1) {
                        currentlyFocusedRow = position;
                    }
                } else {
                    currentlyFocusedRow = -1;
                }
            }
        });
0
Malder

同じ問題を抱えていました。 inputMode、focusabilityなどを使用して、このようなすべてのソリューションを検索しました。最適なソリューションは、リサイクルビューに移行します。

0
Aman Agarwal