我在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" >
有没有人知道为什么会这样?谢谢。
答案 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()是假的?