В чем разница между setFocusable и setFocusableInTouchMode?

В чем разница между setFocusable и setFocusableInTouchMode для Android-представления?

Дополнительный вопрос после попытки прочитать документацию:

И как они отличаются от isFocusable и isFocusableInTouchMode?

Ответ 1

setFocusable, в основном используется для включения/выключения события фокуса фокуса как в сенсорном режиме, так и в режиме клавиатуры (с использованием кнопки вверх/вниз/далее).

setFocusableInTouchMode в основном используется для включения/выключения просмотра фокуса в режиме сенсорного режима.

Если вы отключены setFocusable, он также отключил событие фокуса просмотра в сенсорном режиме.

Ответ 2

Прочитав ответ от @Raj, просмотрев документацию и поэкспериментирую с кодом, я думаю, что понимаю, как они работают теперь немного лучше. Вот небольшая дополнительная помощь, если кто-то еще смущает. Дайте мне знать, если я ошибаюсь.

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

Было три пары вещей, которые меня путали:

isFocusable()
isFocusableInTouchMode()

setFocusable()
setFocusableInTouchMode()

requestFocus()
requestFocusFromTouch()

Первая пара просто сообщает вам информацию о представлении. То есть, возможно ли, чтобы эта точка зрения была сфокусирована. Вы можете узнать, сделав что-то вроде этого:

Boolean b = myView.isFocusable();

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

Boolean b = myView.isFocusableInTouchMode();

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

myView.setFocusable(true);
myView.setFocusableInTouchMode(true);

Если вы находитесь в режиме ожидания и вы вызываете setFocusableInTouchMode(true), то оба myView.isFocusable() и myView.isFocusableInTouchMode() вернут true. Вам не нужно называть их обоих. Однако, если вы вызываете только myView.setFocusable(true), то myView.isFocusableInTouchMode() не будет изменен.

Теперь, чтобы сфокусироваться на сцене, вы должны вызвать следующее:

myView.requestFocus();

Я до сих пор не полностью понимаю requestFocusInTouchMode(), потому что для меня работала только requestFocus(), но документация говорит о requestFocusInTouchMode():

Позвоните, чтобы попытаться сосредоточиться на определенном представлении или на одном из его потомков. Это особый вариант requestFocus(), который позволит представлениям, которые не являются пригодными для сенсорного режима, для запроса фокуса при их касании.

Наконец, следует отметить, что Romain Guy в этом сообщении:

Вид, который фокусируется в режиме touch, имеет странные взаимодействия, и, если вы не понимаете, что делаете, вы НЕ должны его использовать. Функция requestFocus() работает, но фокус отображается только тогда, когда устройство не находится в режиме касания. Как только пользователь коснется экрана, фокус больше не отображается. Делая то, что вы делаете, вы делаете свое приложение отличным от остальных, и вы рискуете странным поведением.