EditText в Listview теряет фокус при нажатии на Android 4.x

Я знаю, что здесь есть много похожих вопросов, но я не мог получить ни одно из предоставленных решений, работающих в простом примере приложения.

Проблема возникает, когда экранная клавиатура отображается в первый раз. Как только это будет показано, только нажав на editText, он снова станет доступен для редактирования.

Пробовал следующее:

android:windowSoftInputMode="adjustPan|adjustResize" 

Это не решение каких-либо проблем. Кажется, что эта строка обязательна, чтобы изменить размер активности после появления всплывающей подсказки. К сожалению, это также заставляет любые EditTexts терять фокус. Скорее всего, это позволит самому ListView получить фокус после процесса изменения размера. Поэтому я попробовал следующее обходное решение:

  listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 

Это всегда вызывает первый видимый EditText, который содержит ListView чтобы получить фокус, что нежелательно. Второй EditText во второй строке должен вместо этого нажимать фокус при нажатии, чего не происходит. Кроме того, если мне в конечном итоге удастся сфокусировать другой EditText другой, чем первый, показанный (например, нажав «Next» на программной softkeyboard ), первый видимый получит фокус после того, как клавиатура будет отклонена, а ListView будет изменен до полного размера ,

Я попробовал несколько других вещей, таких как перехват onFocusChange() для ListView, зная, какой EditText был нажат TouchListener . Задание фокуса для этого некоторого 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 или ромах.

Есть также много других проблем с вложением EditText в ListView , у которых есть решения, которые выглядят как хак. Посмотрите на всех других, кто борется.

Также очень легко добиться чего-то подобного:

как это ,

После того, как я много раз сходил по сходным путям, я в основном отказался от попыток переопределить любое поведение клавиатуры или причуды по умолчанию. Я бы порекомендовал попробовать найти альтернативное решение в вашем приложении, если это возможно.

Считаете ли вы, что строки ListView являются просто TextView а затем отображают Dialog с EditText при щелчке по строке, при необходимости обновляя TextView?

У меня возникли проблемы с «кражей» ActionBar, когда я нажал на EditText, расположенный в строке ListView. Вышеупомянутые решения не сработали, но для меня работало следующее решение:

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

В основном я добавил это в свой ListView:

 android:descendantFocusability="beforeDescendants" 

И добавил это к моей деятельности:

 android:windowSoftInputMode="adjustPan" 

Измените свой манифест xml, чтобы добавить windowSoftInputMode в вашу активность:

 <activity android:name=".YourActivity" android:windowSoftInputMode="adjustPan"> </activity> 

Я знаю, что это очень старый поток, но этот ответ может быть полезен кому-то, вот он:

Переключитесь на RecyclerView, и вам не придется беспокоиться об этих раздражающих проблемах ListView. Вместо того, чтобы делать новый вид, он перерабатывает и повторно использует старые представления.

Используйте recycler View, это решает несколько проблем из списка и gridview. Yo может даже работать со ступенчатыми сетками. Yo мог легко начать работать с этим http://android-er.blogspot.com.co/2015/07/staggeredgridlayoutmanager-google-app.html

Когда список достаточно длинный, чтобы покрыть мягкую клавиатуру, EditText в Listview теряет фокус при нажатии на Android 4.x.

Одним из решений является обернуть Listview в линейном макете с высотой в половину экрана.

Всякий раз, когда Listview не распространяется на клавиатуру, все в порядке.

В моем случае я добавил локальное значение 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 et al. Лучшее решение, переход на просмотр recycler.

У меня была такая же проблема с recyclerView и попытки всех предлагаемых решений.

Наконец, проблема в моем случае состояла в том, что recyclerView имел значение wrap_content как значение для высоты на моем XML случайно; Изменил его на match_parent и начал работать как ожидалось, не focusable значение focusable и не использовал android:windowSoftInputMode="adjustResize"