最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Android中EditText点击获得焦点后无法显示输入法键盘

Android crifan 13823浏览 0评论

【背景】

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

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

比如:

Descriptor的值是EditText

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

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:

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 can show cursor and keyboard inputmethod when clicked

 

【总结】

对于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 = TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_TIME 

再去把之前错写为:

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

找到:

TextView | Android Developers

可知:

前面所说的

InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;

对应的xml中的定义:

EditText中的属性

android:inputType="text"

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

TextView | Android Developers

 

【后记】

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

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

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

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (4)

  1. 你是真能折腾啊,此贴已经收藏了
    le9年前 (2016-06-15)回复
  2. 我也遇到这种情况,但是按照上面设置inputType也不行
    no9年前 (2016-06-15)回复
    • 默认输入法出问题了,换个输入法就好了
      周涛8年前 (2016-12-04)回复
88 queries in 0.199 seconds, using 22.13MB memory