硬件键盘输入失去焦点

时间:2013-01-01 18:28:13

标签: android keyboard android-edittext

我在TabHost中有一个片段,里面有多个文本字段。虚拟键盘可以很好地使用inputType设置输入文本,但硬件键盘(在Droid,Droid 2等上)不起作用。

一旦你开始在硬件键盘上打字,我的测试结果就会失去焦点,而“打字”似乎会转到应用程序的其他地方。我在下面尝试了两种配置:

<EditText
     android:id="@+id/editTextPlusFat"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_weight="0.15"
     android:background="@drawable/textfield_default_holo_light"
     android:digits="0123456789."
     android:ems="10"
     android:hint="@string/str_CalcHintFat"
     android:inputType="number" >

<EditText
     android:id="@+id/editTextPlusFat"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_weight="0.15"
     android:background="@drawable/textfield_default_holo_light"
     android:ems="10"
     android:hint="@string/str_CalcHintFat"
     android:inputType="numberDecimal" >

有没有人知道为什么会这样?谢谢。

2 个答案:

答案 0 :(得分:6)

我的解决方案是将onTouchListener()添加到每个片段中的所有EditTexts - 见下文。

OnTouchListener foucsHandler = new OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent event) {
        // TODO Auto-generated method stub
        arg0.requestFocusFromTouch();
            return false;
    }
};

currentActivity.findViewById(R.id.editTextPlusServings).setOnTouchListener(foucsHandler);
currentActivity.findViewById(R.id.editTextPlusFoodName).setOnTouchListener(foucsHandler);

答案 1 :(得分:6)

duplicate question一样,更好的答案是通过从TabHost覆盖onTouchModeChanged()来删除焦点切换。

添加一个扩展TabHost的新类:

package net.lp.collectionista.ui.views;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TabHost;

public class BugFixedTabHost extends TabHost {

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

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

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

在Fragment(或Activity)中,用BugFixedTabHost替换TabHost类型。

最后,假设您也在布局xmls中使用TabHost,请将其更改为自定义视图(完整包名称):

<net.lp.collectionista.ui.views.BugFixedTabHost
    android:id="@android:id/tabhost" ...

我不确定为什么这对@mattdonders不起作用,但这是正确的方法。它比将侦听器附加到每个EditText要便宜。那么,我们是否已经弄清楚为什么mCurrentView.hasFocus()是假的?