当TabHost存在于活动中时,EditText使用硬键盘失去焦点

时间:2012-06-30 20:37:08

标签: android actionbarsherlock

我在tabhost中显示EditText。 Tabhost位于SherlockFragmentActivity中。

假设我处于触摸模式,我点击EditText给它焦点并开始输入。键入2-3个字符后,我决定使用我的硬键盘。只要按下第一个硬键,我就会退出触摸模式,这也会使焦点移回当前选定的标签。只要我不使用硬导航键将焦点恢复到我的EditText,我将无法输入EditText。

仅当TabHost不在TabActivity中时才会出现此问题。

重现此问题的快速示例代码可能是 - ActionBarSherlock示例代码的FragmentTabs活动。选择CustomTab并尝试使用硬键盘在操作栏中的搜索视图内键入任何文本。看到焦点只是移动到标签。

问题可以在Android 2.2,4.0上重现,也可以使用ICS模拟器。

有没有人有更多信息。关于这个问题?

(这里似乎提到了一种解决方法:https://stackoverflow.com/a/8684025/333137但它看起来像是黑客攻击)

感谢。

编辑:经过更多调查, 我在TabHost类中找到了setup()函数,只有在TabActivity中没有使用TabHost时才需要调用它。 它注册一个键侦听器,只有在按下硬键时才会收到回调。

void setup(){
       // KeyListener to attach to all tabs. Detects non-navigation keys
        // and relays them to the tab content.
        mTabKeyListener = new OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_DPAD_CENTER:
                    case KeyEvent.KEYCODE_DPAD_LEFT:
                    case KeyEvent.KEYCODE_DPAD_RIGHT:
                    case KeyEvent.KEYCODE_DPAD_UP:
                    case KeyEvent.KEYCODE_DPAD_DOWN:
                    case KeyEvent.KEYCODE_ENTER:
                        return false;

                }
                **mTabContent.requestFocus(View.FOCUS_FORWARD);**
                return mTabContent.dispatchKeyEvent(event);
            }

我不确定它为什么调用requestFocus(View.FOCUS_FORWARD),但这并没有将焦点设置在其中的EditText(应该是什么?)。此外,如果在操作栏中搜索视图,它完全在标签外。

1 个答案:

答案 0 :(得分:15)

如下所示覆盖TabHost,它对我有用。

public class TabHostExt extends TabHost {

    public TabHostExt(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TabHostExt(Context context) {
        super(context);
    }

    @Override
    public void onTouchModeChanged(boolean isInTouchMode) {
        // leave it empty here. It looks that when you use hard keyboard,
        // this method will be called and the focus will be token.
    }
}
相关问题