【背景】
android中EditText的Enable已经设置为True了,表示可以被编辑,
但是点击输入框,获得焦点后,无法显示输入法,导致无法输入内容。
比如:
Descriptor的值是EditText
之前已经设置为可编辑了:
EditText variableValueView = (EditText) variableLayout.findViewById(R.id.variableValue); variableValueView.setEnabled(true);
当前值是DESCRIPT,点击后但是不显示输入法,所以没法修改想要的值
【折腾过程】
1.搜:
android edittext cannot input
找了些:
cannot input text into EditText widgets inside ListView – Google Groups
但是都没用
2.注意到,之前加了listener:
OnFocusChangeListener mFocusChangedListener; variableValueView.setOnFocusChangeListener(mFocusChangedListener); mFocusChangedListener = new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { // RelativeLayout parentView = (RelativeLayout)v.getParent(); // TextView labelView = (TextView) parentView.findViewById(R.id.variableLabel); // String labelStr = (String) labelView.getText(); if(hasFocus){ //enter into //Toast.makeText(getApplicationContext(), "got focus: " + v.toString(), Toast.LENGTH_LONG).show(); //Toast.makeText(getApplicationContext(), "got focus: " + labelStr, Toast.LENGTH_LONG).show(); }else { //left //Toast.makeText(getApplicationContext(), "lost focus: " + v.toString(), Toast.LENGTH_LONG).show(); //Toast.makeText(getApplicationContext(), "lost focus: " + labelStr, Toast.LENGTH_LONG).show(); // EditText valueView = (EditText)v; // if(valueView.isEnabled()){ // //only validate new value for editable value // if(mVarValueViewVarNameMap.containsKey(valueView)){ // String varName = mVarValueViewVarNameMap.get(valueView); // String varValue = (String)valueView.getText().toString(); // DeviceModelManager.getInstance().getCurrentDeviceModel().postvalidateVariablesvalue(varName, varValue); // } // } } } };
现在试试,去掉Listener:
//variableValueView.setOnFocusChangeListener(mFocusChangedListener);
看看效果:结果还是不行,点击到可以编辑的EditText中后,还是不能显示出输入法。
3.再去搜:
android edittext not show keyboard
有空再去试试:
android – Custom EditText is not showing keyboard on focus – Stack Overflow
的:
android:focusable="true"
4.另外参考:
java – Programatically Hide/Show Android Soft Keyboard – Stack Overflow
去试试,给我此处的RelativeLayout
加上:
android:focusableInTouchMode="true"
PS:忘了说了,之前是可以正常显示出输入法的。。。不知道为何现在不能显示,也搞不清有哪些改动可能导致此问题的。
结果还是不行。
5.突然想到,难道是当前正在测试的三星的PAD(GT-P5210)有问题?所以去重启PAD试试,结果问题依旧。
6.去掉上面的
android:focusableInTouchMode
试试,结果问题依旧。
7.现在把之前的RelativeLayout中所有的EditText的Enable都改为True看看效果。
记得发现诡异的问题:
在有多个的EditText的情况下,前面几个的InputType都是
TYPE_TEXT_VARIATION_NORMAL
然后切换到
TYPE_CLASS_NUMBER
结果输入法就显示出来了,此时只允许输入数字
然后再切换到别的
TYPE_TEXT_VARIATION_NORMAL
的,输入法就可以正常出现,且允许输入各种字符了。
即:
第一次,焦点点击到String部分的EditText,结果都不能出现输入法
只有先去点击别的Number的,再切换回String的,输入法才正常,才可以输入。。。
所以再去把:
int inputType = InputType.TYPE_TEXT_VARIATION_NORMAL;
换为别的值,但是想要在换之前,再去确认各种可能的类型。
然后搜:
android TYPE_TEXT_VARIATION_NORMAL not show
参考:
android – Show the password with EditText – Stack Overflow
果然和我想的一样,感觉应该用bit or的:
inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
看看效果,结果真的就可以了:
当EditText获得焦点后,就自动显示出输入法,可以输入内容了。而且光标也能显示出来了(之前连光标也没有的)
如图:
【总结】
对于EditText的话,其InputType属性
如果设置为
InputType.TYPE_TEXT_VARIATION_NORMAL
(对应的xml定义中是)
则会导致
可以点击对应的EditText,获得焦点
但是无法显示输入法,无法显示光标
改为:
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
就可以:
在获得焦点后,显示对应的输入法和光标了。
【引申】
1.参考了官网的解释:
InputType | Android Developers
“
A time field:
”
再去把之前错写为:
inputType = InputType.TYPE_DATETIME_VARIATION_TIME;
改为:
inputType = InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME;
2.又从:
Android programmatically disable autocomplete/autosuggest for EditText in emulator – Stack Overflow
的
textVisiblePassword
找到:
可知:
前面所说的
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
对应的xml中的定义:
EditText中的属性
android:inputType="text"
而其他不同类型,可以查看官网即可得到:
【后记】
关于EditText的InputType的更详细的解释,可参考后来的总结: