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

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

Проблема возникает, когда первая страница softkeyboard показана. Как только это будет показано, только нажатие 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, как предложено другими пользователями, не является вариантом для соответствующего проекта.

Ответ 1

Классический взлом для подобных ситуаций заключается в использовании обработчика и 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?

Ответ 2

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

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

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

android:descendantFocusability="beforeDescendants"

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

android:windowSoftInputMode="adjustPan"

Ответ 3

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

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

Ответ 4

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

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

Ответ 6

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

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

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

Ответ 7

В моем случае я добавил локальное значение 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;
                }
            }
        });

Ответ 8

имел ту же проблему. Искал все такие решения с помощью inputMode, focusability et al. Лучшее решение, переход на просмотр ресайклеров.

Ответ 9

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

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