Ответ 1
Замените android:nextFocusLeft
на android:nextFocusDown
. "Следующая" мягкая кнопка или клавиша TAB ищет следующий "вниз" фокус, а не влево или вправо.
У меня есть пользователи с планшетами, у которых есть клавиша табуляции на их мягкой клавиатуре. Я использую представление таблицы и имею 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"/>
Замените android:nextFocusLeft
на android:nextFocusDown
. "Следующая" мягкая кнопка или клавиша TAB ищет следующий "вниз" фокус, а не влево или вправо.
Я также замечаю, что в вашей ссылке:
android:nextFocusRight="@+id/bikeSST"
Символ "+" требуется, если вы еще не определили этот идентификатор, если, возможно, элемент, который вы ссылаетесь, меньше в XML файле.
В противном случае вы, если он уже определен выше (или включен), вы можете опустить символ "+" char:
android:nextFocusRight="@id/bikeSST"
Преимущество использования "+", когда вы ссылаетесь на идентификатор, который должен уже существовать, заключается в том, что проверки IDE и Lint могут обнаружить случай ошибки: что вы имеете в виду идентификатор, который на самом деле не существует.
Если вы включаете "+", вы создаете его, если его не существует, и эта проверка не может быть выполнена.
Вы проверяли атрибут 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();
Вам решать, какое поле будет запрашивать следующее.
Для меня android:nextFocusUp
, android:nextFocusRight
, android:nextFocusDown
и android:nextFocusLeft
не работали, но android:nextFocusForward
действительно работали.
См. Поддержка навигации на клавиатуре, Навигация по вкладке Handle.
Есть лучший способ. Существует 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)
Возможно, вы ищете атрибуты android: nextFocusRight, android: nextFocusLeft, android: nextFocusUp и android: nextFocusDown. Если по умолчанию кнопка вкладки перемещает фокус вниз во вторую строку, я бы подумал, что вы можете установить android: nextFocusDown на идентификатор представления, который вы хотите получить в фокусе. Затем, когда пользователь нажимает вкладку, wold перемещает фокус на любой вид, который вы указываете, хотя в этом случае он находится справа от текущего представления, а не ниже.
Замените android:nextFocusLeft
на android:nextFocusForward
.