我目前有一个包含4个标签的TabHost
。在一些片段上,我们在布局中有许多EditText
个视图。
我们注意到,当您尝试使用硬件键盘输入任何EditText
视图时,焦点会从EditText
中被盗,并被提供给{{1}中的当前活动标签}}。这仅发生在带有标签的屏幕上。有没有一种快速简单的方法来解决这个问题?
答案 0 :(得分:3)
这已经是一个已知的错误很长一段时间了:
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();
}
});
编辑:如果这不起作用,你可以尝试相反的方式。强制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
答案 1 :(得分:3)
我在http://code.google.com/p/android/issues/detail?id=2516找到了这个解决方案,它比这里的任何解决方案或错误报告页面更好,因为它解决了根本原因而不是解决它。我将让作者(g1adrift)解释:
在深入挖掘Android源代码后,我发现了这个错误: TabHost在onAttachedToWindow()中注册一个OnTouchModeChangeListener 当离开触摸模式时(即当有人按下时),它会窃取焦点 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"搜索帖子。
答案 2 :(得分:1)
@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支持库示例中复制粘贴