Можете ли вы установить "порядок вкладок" в XML-макете?

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

Когда пользователь нажимает вкладку, он переводит их в следующее поле ниже, а не следующее поле справа.

Есть ли способ в макете установить порядок вкладок или это делается только программно?

Если это можно сделать только на Java, как именно это делается?

Спасибо за отзыв на NextFocusRight, но он не работал (или я сделал что-то не так)

Вот код, который я использовал. Мне нужно добавить изображения, чтобы отобразить "следующую" кнопку в моем эмуляторе. Вы видите что-то не так с тем, как я это сделал?

    <EditText 
android:id="@+id/bikeHHT"
android:layout_width="50dip"
android:layout_height="40dip"
android:textSize="14px"
android:maxLength="2"
android:nextFocusLeft="@+id/bikeMMT"
android:imeOptions="actionNext"
android:layout_column="1"/>
<EditText 
android:id="@+id/bikeMMT"
android:layout_width="50dip"
android:layout_height="40dip"
android:textSize="14px"
android:nextFocusRight="@+id/bikeSST"
android:imeOptions="actionNext"
android:maxLength="2"/>

Ответ 1

Замените android:nextFocusLeft на android:nextFocusDown. "Следующая" мягкая кнопка или клавиша TAB ищет следующий "вниз" фокус, а не влево или вправо.

Ответ 2

Я также замечаю, что в вашей ссылке:

android:nextFocusRight="@+id/bikeSST"

Символ "+" требуется, если вы еще не определили этот идентификатор, если, возможно, элемент, который вы ссылаетесь, меньше в XML файле.

В противном случае вы, если он уже определен выше (или включен), вы можете опустить символ "+" char:

android:nextFocusRight="@id/bikeSST"

Преимущество использования "+", когда вы ссылаетесь на идентификатор, который должен уже существовать, заключается в том, что проверки IDE и Lint могут обнаружить случай ошибки: что вы имеете в виду идентификатор, который на самом деле не существует.

Если вы включаете "+", вы создаете его, если его не существует, и эта проверка не может быть выполнена.

Ответ 3

Вы проверяли атрибут android:imeOptions="actionNext" для EditText?

Он заменяет имя клавиши ввода на "Следующая" на виртуальной клавиатуре и нажимая на нее - переходы фокусировки в следующее поле.

В вашем макете вы будете делать что-то вроде этого

<EditText
    ...
    android:text="Field 1"
    android:imeOptions="actionNext" />
<EditText
    ...
    android:text="Field 2"
    android:imeOptions="actionNext" />

И в Java

TextView field2 = (TextView) field1.focusSearch(View.FOCUS_RIGHT);
field2.requestFocus();

Вам решать, какое поле будет запрашивать следующее.

Ответ 5

Есть лучший способ. Существует XML-аргумент, который вы можете поместить в свой макет, который автоматически перемещает курсор через каждый EditText по мере того, как пользователь их завершает. Это позволяет значительно упростить реализацию формы.

Проблема в том, что проклятая жизнь помнит, что это за черт...

Обязательно проверьте свойства android: nextFocus * xml. Нормальное действие формы - вниз. Но, возможно, есть кнопка справа, чтобы вы хотели получить следующий фокус (например, вхождение в игру или подобное).

http://developer.android.com/reference/android/view/View.html#attr_android:nextFocusDown

Там также доступны некоторые программные опции:

http://developer.android.com/reference/android/view/View.html#setNextFocusDownId(int)

Ответ 6

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

Ответ 7

Замените android:nextFocusLeft на android:nextFocusForward.