Я показываю EditText внутри tabhost. Tabhost находится внутри SherlockFragmentActivity.
Предположим, я нахожусь в сенсорном режиме и нажимаю на EditText, чтобы выделить его и начать печатать на нем. Набрав 2-3 символа, я решил использовать свою жесткую клавиатуру. Как только я нажимаю первую жесткую клавишу, я выхожу из сенсорного режима, и это также приводит к тому, что фокус возвращается к текущей выбранной вкладке. Пока я не использую аппаратные клавиши навигации, чтобы вернуть фокус в свой EditText, я не смогу вводить текст в EditText.
Эта проблема возникает только тогда, когда TabHost не находится внутри TabActivity.
Быстрый пример кода для воспроизведения этой проблемы может быть - активность FragmentTabs примера кода ActionBarSherlock. Выберите CustomTab и попробуйте ввести любой текст в поле поиска на панели действий с помощью жесткой клавиатуры. См. фокус просто перемещается на вкладку.
Проблема воспроизводится на Android 2.2, 4.0, а также с использованием эмулятора ICS.
Кто-нибудь имеет больше информации. об этом вопросе?
(Здесь упоминается обходной путь: https://stackoverflow.com/a/8684025/333137, но похоже взлом)
Спасибо.
Редактировать: После более подробного изучения я обнаружил функцию setup() внутри класса TabHost, которую нужно вызывать только в том случае, если TabHost не используется внутри TabActivity. Он регистрирует прослушиватель ключей, который получает обратный вызов только при нажатии жесткой клавиши.
void setup(){
// KeyListener to attach to all tabs. Detects non-navigation keys
// and relays them to the tab content.
mTabKeyListener = new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT:
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_ENTER:
return false;
}
**mTabContent.requestFocus(View.FOCUS_FORWARD);**
return mTabContent.dispatchKeyEvent(event);
}
Я не уверен, почему он вызывает requestFocus(View.FOCUS_FORWARD), но это не устанавливает фокус на EditText внутри него (что должно быть?). Кроме того, в случае просмотра поиска на панели действий он полностью находится за пределами вкладки.