android - 当たら - requestfocus direction




Android 4.xでListViewのEditTextがフォーカスを失う (6)

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

この問題は、 ソフトキーボードが初めて表示されたときに発生します。 表示されるとすぐに、 editTextを押すだけで編集可能になります。

次のように試しました:

 android:windowSoftInputMode="adjustPan|adjustResize"

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

 listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

これにより、 ListViewがフォーカスを得るために最初に表示されるEditTextが常に発生します。これは望ましくありません 。 2番目の行の2番目のEditTextは、押されたときにフォーカスを取得するはずですが、これは起こっていません。 また、もし私が最終的に別のEditText(例えば、 softkeyboard上で「次へ」を押すことによって表示された)以外のsoftkeyboardをフォーカスすると、キーボードがsoftkeyboardしてListViewがフルサイズに再びサイズ変更された後、 。

私はTouchListenerによってどのEditTextが押されたのかを知っている間、ListViewのonFocusChange()イベントをインターセプトするようないくつかのことを試しTouchListener 。 特定のEditTextのフォーカスを再度要求しても成功に至らなかった。

ListView代わりにScrollViewを使用することは、関連するプロジェクトのオプションでもありません。


ListViewの行内にあるEditTextを押したときに、ActionBarの「スティール」フォーカスに問題がありました。 上記の解決策はうまくいかなかったが、以下の解決策が私のために働いた。

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

基本的に私はこれを私のListViewに追加しました:

android:descendantFocusability="beforeDescendants"

私の活動にこれを加えました:

android:windowSoftInputMode="adjustPan"

このような状況のための古典的なハックは、ハンドラと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;
}

これは私のデバイス上で動作しますが、このコードを生産中に保ちます。 フォーカスバグが異なるアンドロイドバージョンやROMで異なると、驚くことはありません。

ListView内にEditTextを埋め込むことには、ハックのような感覚を持つソリューションを持つ他にも多くの問題があります。 otherすべてother people苦労しているother見てください。

このようなことが起こるのはとても簡単です。

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

ListView行をスタイル付きのTextViewにして、行がクリックされたときにEditText Dialogを表示し、必要に応じてTextViewを更新することをEditTextしましたか?



リストがソフトキーボードをカバーするのに十分な長さである場合、リストListviewはAndroid 4.xで押されるとフォーカスが失われます。

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

ListviewListviewカバーしていないときはいつでも、すべてが問題ありません。


私の場合は、ローカルの値currentlyFocusedRowをアダプタに追加しました。 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;
                }
            }
        });

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

最後に、私の場合の問題は、 recyclerViewが私のXMLの高さの値としてwrap_content持っていたことwrap_content 。 それをmatch_parent変更し、期待通りに作業を開始しました。 focusable値は設定されず、 android:windowSoftInputMode="adjustResize"を使用しましたandroid:windowSoftInputMode="adjustResize"







ontouchlistener