EditText теряет фокус с помощью жесткой клавиатуры, когда TabHost присутствует в действии

Я показываю 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 внутри него (что должно быть?). Кроме того, в случае просмотра поиска на панели действий он полностью находится за пределами вкладки.


person vivek.m    schedule 30.06.2012    source источник


Ответы (1)


Переопределите TabHost, как показано ниже, у меня это работает.

public class TabHostExt extends TabHost {

    public TabHostExt(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TabHostExt(Context context) {
        super(context);
    }

    @Override
    public void onTouchModeChanged(boolean isInTouchMode) {
        // leave it empty here. It looks that when you use hard keyboard,
        // this method will be called and the focus will be token.
    }
}
person Hank    schedule 20.07.2012
comment
Хэнк - я знаю, что этот пост старый, но хотел продолжить, так как я был связан здесь для очень похожей ситуации. У меня есть ViewPagerActivity внутри SherlockActivity, и я вижу такое же поведение TabHost, крадущего Focus из EditText. Вы переопределили функцию TabHost в действии или во фрагменте? Спасибо - больше информации ниже. - person mattdonders; 07.01.2013
comment
В качестве еще одного примечания я попытался getCurrentFocus() внутри onFocusChangeListener() в EditText, и я вижу, что TabHost пытается украсть фокус, и есть NullPointerException, а в журнале я вижу, что onTouchModeChanged() пытается выполнить на TabHost, но расширяет TabHost и Переопределение функции, похоже, не работает. Я пробовал это во фрагменте и в действии. - person mattdonders; 07.01.2013
comment
@mattdonders, onTouchModeChanged() - это метод TabHostExt, я не понимаю вашего вопроса о переопределении в Activity или Fragment. Мой TabHostExt используется во фрагменте. Для NPE, не могли бы вы сказать, какой объект является нулевым в вашем каземе mCurrentView или mTabWidget - person Hank; 08.01.2013
comment
Проблема с фокусом иногда возникает также для комбинации TabHost, программной клавиатуры, HTML-страницы с текстовыми полями, открытыми в WebView. Это решение работает. - person Giulio Piancastelli; 08.05.2014