EditText в Listview теряет фокус при нажатии на Android 4.икс
Я знаю, что есть много подобных вопросов здесь но я не мог получить ни одного из предоставленных решений, работающих в простом примере приложения.
проблема возникает, когда softkeyboard отображается в первый раз. Как только это будет показано, только нажав кнопку editText снова делает его редактируемым.
попробовал следующее:
android:windowSoftInputMode="adjustPan|adjustResize"
это не решает никаких проблем. Кажется, что эта строка является обязательной для размер действия изменяется после появления softkeyboard. К сожалению, это также вызывает любые EditTexts терять фокус. Это, наверное, к ListView сам набирает Фокус после процесса изменения размера. Поэтому я попробовал следующий обходной путь:
listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
это всегда вызывает "первый"!--11-->видимый EditText что ListView
содержит для получения фокуса, что нежелательно. Второй EditText во второй строке должен вместо этого получить фокус, когда нажал, чего не происходит. Кроме того, если мне в конечном итоге удалось сфокусировать другой EditText, а не первый показанный (например, нажав "Далее" на softkeyboard
), первый видимый получит Фокус после того, как клавиатура будет отклонена, а ListView снова будет изменен до полного размера.
Я пробовал несколько других вещей, таких как перехват onFocusChange()
события для ListView, зная, какой EditText был нажат его TouchListener
. Просит сосредоточиться на том, что определенные полей EditText опять же, это не привело ни к какому успеху.
С помощью ScrollView
вместо ListView
как было предложено другими пользователями, это не вариант для соответствующего проекта.
9 ответов:
классический хак для таких ситуаций, как это, чтобы использовать обработчик и
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. Вместо того, чтобы сделать новый вид, он перерабатывает и повторно использует старые взгляды.
использовать режим рециркуляции, это решает сразу несколько вопросов из списка и GridView. Йо может даже работать с шахматным gridviews. Йо может легко начать работать с этим http://android-er.blogspot.com.co/2015/07/staggeredgridlayoutmanager-google-app.html
когда список достаточно длинный, чтобы покрыть мягкую клавиатуру,
EditText
наListview
теряет фокус при нажатии на Android 4.x.одним из решений является, чтобы обернуть
Listview
в линейный макет с высотой в половину экрана., когда
Listview
не покрывает softkeyboard, все в порядке.
в моем случае я добавил локальное значение 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; } } });
была такая же проблема. Искал все такие решения с inputMode,focusability и др. Лучше всего, перенести переработчик вид.
у меня была такая же проблема с
recyclerView
и пробовать все предложенные решения.наконец, проблема в моем случае заключалась в том, что
recyclerView
сwrap_content
Как значение высоты на моем XML случайно; изменил его наmatch_parent
и начал работать, как ожидалось, нетfocusable
набор значений и использованиеandroid:windowSoftInputMode="adjustResize"