Подтвердить что ты не робот

На вкладках TabHost на вкладке Android во время использования аппаратной клавиатуры

В настоящее время у меня есть TabHost, содержащий 4 вкладки. На нескольких фрагментах у нас есть несколько представлений EditText в макете.

Мы заметили, что при попытке ввести любой из представлений EditText с помощью аппаратной клавиатуры фокус будет украден из EditText и указан на текущей активной вкладке в TabHost. Это происходит только на экранах с вкладками. Есть ли простой и простой способ решить эту проблему?

4b9b3361

Ответ 1

Это была известная ошибка в течение довольно длительного времени:

http://code.google.com/p/android/issues/detail?id=2516

Обходной путь заставит TabHost потерять фокус после выбора вкладки. Это делается путем установки OnTabChangeListener для TabHost и вызова clearFocus в методе onTabChanged.

tabHost.setOnTabChangedListener(new OnTabChangeListener(){    
    public void onTabChanged(String tabID) {    
        tabHost.clearFocus(); 
    }   
}); 

EDIT: Если это не сработает, вы можете попробовать по-другому. Вместо того, чтобы вместо полей EditText получить фокус, вместо этого:

OnTouchListener focusHandler = new OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        // TODO Auto-generated method stub
        view.requestFocusFromTouch();
        return false;
    }
};

editText.setOnTouchListener(focusHandler); //For each EditText with this issue

Ответ 2

Я нашел это решение в http://code.google.com/p/android/issues/detail?id=2516, и он работает лучше, чем любое из решений здесь или на странице отчета об ошибке, поскольку он адресует основной причиной вместо того, чтобы обойти его. Я позволю автору (g1adrift) объяснить:

После многократного перетаскивания через источник Android я обнаружил ошибку: TabHost регистрирует OnTouchModeChangeListener в onAttachedToWindow() что крадет фокус при выходе из режима касания (например, когда кто-то нажимает кнопку key), если текущее представление содержимого вкладки не имеет фокуса. Хотя это может иметь смысл, если весь макет включен в закладки, если есть только часть макета с вкладками, это вызывает проблемы.

Это обходное решение удаляет этот прослушиватель, поэтому все артефакты его использования должен уйти:

в onCreate(), добавьте:

TabHost mTabHost = (TabHost) findViewById(android.R.id.tabhost);
mTabHost.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {

    @Override
    public void onViewDetachedFromWindow(View v) {}

    @Override
    public void onViewAttachedToWindow(View v) {
        mTabHost.getViewTreeObserver().removeOnTouchModeChangeListener(mTabHost);
    }
});

Он предположительно работает только для SDK 12+. Автор также опубликовал решение для более ранних SDK. Если вам это нужно, нажмите на ссылку выше и найдите сообщения "g1adrift".

Ответ 3

 @Override
    public void onPageSelected(int position) {
        // Unfortunately when TabHost changes the current tab, it kindly
        // also takes care of putting focus on it when not in touch mode.
        // The jerk.
        // This hack tries to prevent this from pulling focus out of our
        // ViewPager.
        TabWidget widget = mTabHost.getTabWidget();
        int oldFocusability = widget.getDescendantFocusability();
        widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
        mTabHost.setCurrentTab(position);
        widget.setDescendantFocusability(oldFocusability);

    }

copy-paste из примеров библиотек поддержки Android