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
しましたか?
リサイクラViewを使用すると、listとgridviewからいくつかの問題が解決されます。 よろしくお願いします。 このhttp://android-er.blogspot.com.co/2015/07/staggeredgridlayoutmanager-google-app.html簡単に作業を開始できます
リストがソフトキーボードをカバーするのに十分な長さである場合、リストListview
はAndroid 4.xで押されるとフォーカスが失われます。
1つの解決策は、画面の半分の高さを持つ線形レイアウトでListview
をラップすることListview
。
Listview
がListview
カバーしていないときはいつでも、すべてが問題ありません。
私の場合は、ローカルの値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"