Ответ 1
После копания в источниках Android я понимаю, как отправить фокус на ViewGroup
детей. Например, у меня есть пользовательский ViewGroup
с несколькими EditText
полями внутри. Когда пользователь нажимает ViewGroup
(за пределами каждого EditText
), я хочу отправить фокус на одно из полей.
Чтобы сделать это, нам нужно установить способность потомка к FOCUS_AFTER_DESCENDANTS
. Это означает, что мы можем обрабатывать событие фокусировки до, наш пользовательский вид попытается сфокусироваться:
setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
Следующим шагом является переопределить метод onRequestFocusInDescendants
, он будет вызываться перед пользовательским представлением requestFocus
, если установлен флаг FOCUS_AFTER_DESCENDANTS
. В этом методе мы можем запросить фокус для ребенка:
@Override
protected boolean onRequestFocusInDescendants(final int dir, final Rect rect) {
return getChildAt(this.target).requestFocus();
}
Одна важная вещь с этим методом: если мы вернем true
здесь, наше пользовательское представление не будет запрашиваться для фокусировки (только с FOCUS_AFTER_DESCENDANTS
).
Таким образом, мы можем изменить поле target
, чтобы изменить, какой дочерний объект будет сфокусирован при нажатии ViewGroup
.
<ч/" > Для лучшего понимания вы можете найти метод requestFocus
в ViewGroup
в источниках Android.