使用硬件键盘时,Android TabHost标签会窃取焦点

时间:2013-03-27 20:49:20

标签: android tabs keyboard android-tabhost

我目前有一个包含4个标签的TabHost。在一些片段上,我们在布局中有许多EditText个视图。

我们注意到,当您尝试使用硬件键盘输入任何EditText视图时,焦点会从EditText中被盗,并被提供给{{1}中的当前活动标签}}。这仅发生在带有标签的屏幕上。有没有一种快速简单的方法来解决这个问题?

3 个答案:

答案 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支持库示例中复制粘贴