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"
.