我目前有一个TabHost
包含 4 个选项卡。在一些片段上,我们EditText
在布局中有许多视图。
我们注意到,当您尝试EditText
使用硬件键盘输入任何视图时,焦点会EditText
从TabHost
. 这只发生在带有标签的屏幕上。有没有一种快速简单的方法来解决这个问题?
我目前有一个TabHost
包含 4 个选项卡。在一些片段上,我们EditText
在布局中有许多视图。
我们注意到,当您尝试EditText
使用硬件键盘输入任何视图时,焦点会EditText
从TabHost
. 这只发生在带有标签的屏幕上。有没有一种快速简单的方法来解决这个问题?
很长一段时间以来,这一直是一个已知的错误:
http://code.google.com/p/android/issues/detail?id=2516
一种解决方法是在选择选项卡后强制TabHost
失去焦点。这是通过在方法中设置 a并调用OnTabChangeListener
来完成的。TabHost
clearFocus
onTabChanged
tabHost.setOnTabChangedListener(new OnTabChangeListener(){
public void onTabChanged(String tabID) {
tabHost.clearFocus();
}
});
编辑:如果这不起作用,您可以尝试相反的方法。改为强制 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
我在http://code.google.com/p/android/issues/detail?id=2516找到了这个解决方案,它比这里或错误报告页面上的任何解决方案都更好,因为它解决了根本原因解决它。我会让作者 (g1adrift) 解释一下:
在深入研究了 Android 源代码之后,我发现了这个错误:如果当前选项卡内容视图没有焦点,TabHost 在 onAttachedToWindow() 中注册了一个 OnTouchModeChangeListener,它在离开触摸模式(也就是有人按下键时)时会窃取焦点。虽然如果整个布局是选项卡,这可能是有意义的,但如果只有一部分布局具有选项卡,则会导致问题。
此解决方法删除了该侦听器,因此使用它的所有工件都应该消失:
在 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”的帖子。
@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);
}
从 android 支持库示例中复制粘贴