На вкладках TabHost на вкладке Android во время использования аппаратной клавиатуры
В настоящее время у меня есть TabHost
, содержащий 4 вкладки. На нескольких фрагментах у нас есть несколько представлений EditText
в макете.
Мы заметили, что при попытке ввести любой из представлений EditText
с помощью аппаратной клавиатуры фокус будет украден из EditText
и указан на текущей активной вкладке в TabHost
. Это происходит только на экранах с вкладками. Есть ли простой и простой способ решить эту проблему?
Ответы
Ответ 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