Android中EditText点击获得焦点后无法显示输入法键盘

转载出自:https://www.crifan.com/android_edittext__got_focus_but_not_show_keyboard_inputmethod/


马克


【背景】

android中EditText的Enable已经设置为True了,表示可以被编辑,

但是点击输入框,获得焦点后,无法显示输入法,导致无法输入内容。

比如:

Descriptor的值是EditText

之前已经设置为可编辑了:

?
1
2
EditText variableValueView = (EditText) variableLayout.findViewById(R.id.variableValue);
variableValueView.setEnabled( true );

当前值是DESCRIPT,点击后但是不显示输入法,所以没法修改想要的值

descript edittext clicked but not show keyboard

 

【折腾过程】

1.搜:

android edittext cannot input

找了些:

cannot input text into EditText widgets inside ListView – Google Groups

但是都没用

2.注意到,之前加了listener:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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:

?
1
//variableValueView.setOnFocusChangeListener(mFocusChangedListener);

看看效果:结果还是不行,点击到可以编辑的EditText中后,还是不能显示出输入法。

3.再去搜:

android edittext not show keyboard

有空再去试试:

android – Custom EditText is not showing keyboard on focus – Stack Overflow

的:

?
1
android:focusable="true"

4.另外参考:

java – Programatically Hide/Show Android Soft Keyboard – Stack Overflow

去试试,给我此处的RelativeLayout加上:

?
1
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的,输入法才正常,才可以输入。。。

所以再去把:

?
1
int inputType = InputType.TYPE_TEXT_VARIATION_NORMAL;

换为别的值,但是想要在换之前,再去确认各种可能的类型。

然后搜:

android TYPE_TEXT_VARIATION_NORMAL not show

参考:

android – Show the password with EditText – Stack Overflow

果然和我想的一样,感觉应该用bit or的:

?
1
inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;

看看效果,结果真的就可以了:

当EditText获得焦点后,就自动显示出输入法,可以输入内容了。而且光标也能显示出来了(之前连光标也没有的)

如图:

edittext can show cursor and keyboard inputmethod when clicked

 

【总结】

对于EditText的话,其InputType属性

如果设置为

?
1
InputType.TYPE_TEXT_VARIATION_NORMAL

(对应的xml定义中是)

则会导致

可以点击对应的EditText,获得焦点

但是无法显示输入法,无法显示光标

改为:

?
1
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;

就可以:

在获得焦点后,显示对应的输入法和光标了。

 

【引申】

1.参考了官网的解释:

InputType | Android Developers

A time field:

    inputType = TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_TIME 

再去把之前错写为:

?
1
inputType = InputType.TYPE_DATETIME_VARIATION_TIME;

改为:

?
1
inputType = InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME;

2.又从:

Android programmatically disable autocomplete/autosuggest for EditText in emulator – Stack Overflow

textVisiblePassword

找到:

TextView | Android Developers

可知:

前面所说的

?
1
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;

对应的xml中的定义:

EditText中的属性

?
1
android:inputType="text"

而其他不同类型,可以查看官网即可得到:

TextView | Android Developers

 

【后记】

关于EditText的InputType的更详细的解释,可参考后来的总结:

【整理】Android中EditText(或TextView)中的InputType类型含义与如何定义

转载请注明:在路上 » 【已解决】Android中EditText点击获得焦点后无法显示输入法键盘


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值