11

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

我们注意到,当您尝试EditText使用硬件键盘输入任何视图时,焦点会EditTextTabHost. 这只发生在带有标签的屏幕上。有没有一种快速简单的方法来解决这个问题?

4

3 回答 3

3

很长一段时间以来,这一直是一个已知的错误:

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

一种解决方法是在选择选项卡后强制TabHost失去焦点。这是通过在方法中设置 a并调用OnTabChangeListener来完成的。TabHostclearFocusonTabChanged

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
于 2013-04-04T12:39:14.630 回答
3

我在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”的帖子。

于 2015-10-02T21:28:01.137 回答
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 支持库示例中复制粘贴

于 2013-04-11T08:12:23.280 回答