android: nextFocusForward идет в неправильный EditText

Я работаю над проектом android, и я использую android:nextFocusButton таким образом, пользователь может нажать кнопку Далее на мягкой клавиатуре для перемещения по EditText без необходимости нажимать каждый текст редактирования, чтобы изменить фокус.

в макете я прошу пользователей по имени и фамилии, в отдельном EditText в линейном макете, который находится в горизонтальном

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

Basic Screen Layout

то, что я пытаюсь сделать, это в первом имени редактировать текст, пользователь может нажать next, который затем должен переключить фокус на последнее имя редактировать текст, затем они снова нажмите next, и он переходит к тексту редактирования компании.

вместо того, что происходит, это первое имя имеет фокус, пользователь нажимает кнопку Далее, и он переходит к тексту редактирования компании вместо фамилии.

Ниже приведен фрагмент моего XML макет

<LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
                <EditText android:id="@+id/createAccount_txtFirstName"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:hint="@string/first_name"
                    android:singleLine="true"
                    android:inputType="textCapSentences"
                    android:nextFocusForward="@+id/createAccount_txtLastName"/>
                <EditText android:id="@+id/createAccount_txtLastName"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:hint="@string/last_name"
                    android:singleLine="true"
                    android:inputType="textCapSentences"
                    android:nextFocusForward="@+id/createAccount_txtCompanyName"/>
            </LinearLayout>
            <EditText android:id="@+id/createAccount_txtCompanyName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/company_name"
                android:singleLine="true"
                android:inputType="textCapSentences"
                android:nextFocusForward="@+id/createAccount_txtEmail"/>

Спасибо за любую помощь вы можете предоставить.

3 ответов


просто поместите это в свой первый edittext. Также замените nextFocusForward на nextFocusDown

<EditText android:id="@+id/createAccount_txtFirstName"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:hint="@string/first_name"
                android:singleLine="true"
                android:inputType="textCapSentences"
                android:nextFocusDown="@+id/createAccount_txtLastName">
 <requestFocus />
</EditText>

Кажется, что он прослушивается при запуске этого кода на эмуляторе. Тем не менее, он работает на телефонах


возможно, ваш XML игнорируется алгоритмом Android focus. Документация гласит следующее:

в редких случаях, алгоритм по умолчанию может не соответствовать назначению поведение разработчика. В этих ситуациях вы можете предоставить явные переопределения со следующими атрибутами XML в макете файл: nextFocusDown, nextFocusLeft, nextFocusRight и nextFocusUp.

У меня была аналогичная проблема, и я решил ее с помощью nextFocusDown.

подробнее о официальная документация


ни одно из решений не работало для меня, за исключением прослушивания прослушивателя действий редактора и программной установки фокуса на следующий EditText.

    mFirstName.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            mLastName.requestFocus();
            return true;
        }
    });