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 60

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 которые имеют решения, которые чувствуют себя как хак. Смотрите все другое человек борется.

это также очень легко, чтобы иметь что-то вроде этого:

like this.

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

вы рассматривали имеющего 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"