ここには似たような質問がたくさんありますが、提供されているソリューションをシンプルなサンプルアプリで動作させることはできませんでした。
問題はsoftkeyboardが初めて表示されるときに発生します。表示されたらすぐにeditTextをもう一度押すだけで編集可能になります。
以下を試しました:
_ Android:windowSoftInputMode="adjustPan|adjustResize"
_
これは問題を解決していません。この行は、ソフトキーボードがポップアップした後にアクティビティのサイズを変更するために必須のようです。残念ながら、これはEditTextsがフォーカスを失う原因にもなります。これはおそらくListView自体がサイズ変更プロセスの後にフォーカスを得ているためです。そこで、次の回避策を試しました。
_ listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
_
これにより、常に最初の可視のEditTextがListView
に含まれるため、フォーカスを取得しますが、これは望ましくありません。代わりに、2行目の2番目のEditTextが押されたときにフォーカスを取得する必要があります。また、最終的に最初の表示以外の別のEditTextにフォーカスすることができた場合(たとえば、softkeyboard
で「次へ」を押すことにより)、キーボードが閉じられ、ListViewがサイズ変更された後に最初に表示されるものがフォーカスを取得します再びそのフルサイズ。
ListViewのonFocusChange()
イベントをインターセプトするなど、TouchListener
によって押されたEditTextを把握しながら、他のいくつかのことを試しました。その特定のEditTextのフォーカスを再度要求しても、成功することはありませんでした。
他のユーザーによって提案されたScrollView
の代わりにListView
を使用することは、関係するプロジェクトにとっても選択肢ではありません。
このような状況の古典的なハックは、ハンドラーと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 もがきを参照してください。
このようなことが起こるのも非常に簡単です:
。
私が何度も同じようなパスをたどった後、デフォルトのキーボードの動作や癖をオーバーライドしようとすることをほとんどあきらめました。可能であれば、アプリで代替ソリューションを見つけることをお勧めします。
ListView
行をスタイル付きTextView
にして、行がクリックされたときにDialog
とともにEditText
を表示し、TextViewを必要?
ListViewの行内にあるEditTextを押したときに、ActionBarの「スチール」フォーカスで問題が発生していました。上記の解決策は機能しませんでしたが、次の解決策はうまくいきました。
http://www.mysamplecode.com/2013/02/Android-edittext-listview-loses-focus.html
基本的に、これをリストビューに追加しました:
Android:descendantFocusability="beforeDescendants"
これを私のアクティビティに追加しました:
Android:windowSoftInputMode="adjustPan"
マニフェストxmlを変更して、アクティビティにwindowSoftInputModeを追加します。
<activity
Android:name=".YourActivity"
Android:windowSoftInputMode="adjustPan">
</activity>
私は非常に古いスレッドを知っていますが、この答えは誰かに役立つかもしれませんので、ここにあります:
RecyclerViewに切り替えると、ListViewのこれらの迷惑な問題を心配する必要がなくなります。新しいビューを作成する代わりに、古いビューをリサイクルして再利用します。
私はrecyclerView
で同じ問題を抱えていて、提案されたすべての解決策を試していました。
最後に、私の場合の問題は、recyclerView
が誤ってXMLの高さの値としてwrap_content
を持っていることでした。 match_parent
に変更し、期待どおりに動作を開始しました。focusable
値が設定されておらず、Android:windowSoftInputMode="adjustResize"
を使用しています
リストがソフトキーボードをカバーするのに十分な長さである場合、EditText
のListview
は、Android 4.x.
1つの解決策は、Listview
を画面の半分の高さの線形レイアウトでラップすることです。
Listview
がソフトキーボードをカバーしていないときはいつでも、すべてが問題ありません。
リサイクラービューを使用すると、リストとグリッドビューのいくつかの問題が解決します。 Yoは、スタッガードグリッドビューでも動作できます。 Yoはこれで簡単に作業を開始できます http://Android-er.blogspot.com.co/2015/07/staggeredgridlayoutmanager-google-app.html
私の場合、アダプターにローカル値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;
}
}
});
同じ問題を抱えていました。 inputMode、focusabilityなどを使用して、このようなすべてのソリューションを検索しました。最適なソリューションは、リサイクルビューに移行します。