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

【背景】

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类型含义与如何定义


现在整理如下:

 

EditText的InputType属性,可以在代码中设置,也可以预先在xml中定义

设置EditText的InputType属性,最简单省事的办法就是在定义EditText的xml中直接设置。

比如:

想要设置一个可编辑的文本框的输入内容为只能输入数字,则就可以:

(1)xml中定义InputType为number

?
1
2
3
4
< EditText 
     android:id = "@+id/variableValue"
     ......
     android:inputType = "number"  />

(2)代码中设置InputType为TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_NORMAL

?
1
2
3
EditText variableValueView = (EditText) variableLayout.findViewById(R.id.variableValue);
int  inputType = InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL;
variableValueView.setInputType(inputType);

 

这样的话,之后界面中生成的EditText,当点击后要输入内容的时候,弹出的输入法,自动变成那种只能输入数字的小键盘类型的了:

EditText set to number show keyboard only show number

 

另外,附上,正常的普通字符串,即:

xml中:

?
1
android:inputType="text"

或代码中:

?
1
someEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL);

时,显示出来的输入法键盘的效果:

edittext inputtype is text how keyboard look like

 

EditText的InputType属性对应的xml定义有哪些,以及代码中设置的InputType类型有哪些

知道了设置EditText的InputType属性值,既可以通过xml中定义,也可以在代码中设置为InputType的某种值,但是到底这些值有哪些,以及分别对应的含义是啥,则可以参考官网:

TextView | Android Developers – android:inputType

中的完整的列表:

Constant

Value

Description

none

0×00000000

There is no content type. The text is not editable.

text

0×00000001

Just plain old text. Corresponds toTYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_NORMAL.

textCapCharacters

0×00001001

Can be combined with text and its variations to request capitalization of all characters. Corresponds toTYPE_TEXT_FLAG_CAP_CHARACTERS.

textCapWords

0×00002001

Can be combined with text and its variations to request capitalization of the first character of every word. Corresponds toTYPE_TEXT_FLAG_CAP_WORDS.

textCapSentences

0×00004001

Can be combined with text and its variations to request capitalization of the first character of every sentence. Corresponds toTYPE_TEXT_FLAG_CAP_SENTENCES.

textAutoCorrect

0×00008001

Can be combined with text and its variations to request auto-correction of text being input. Corresponds toTYPE_TEXT_FLAG_AUTO_CORRECT.

textAutoComplete

0×00010001

Can be combined with text and its variations to specify that this field will be doing its own auto-completion and talking with the input method appropriately. Corresponds toTYPE_TEXT_FLAG_AUTO_COMPLETE.

textMultiLine

0×00020001

Can be combined with text and its variations to allow multiple lines of text in the field. If this flag is not set, the text field will be constrained to a single line. Corresponds toTYPE_TEXT_FLAG_MULTI_LINE.

textImeMultiLine

0×00040001

Can be combined with text and its variations to indicate that though the regular text view should not be multiple lines, the IME should provide multiple lines if it can. Corresponds toTYPE_TEXT_FLAG_IME_MULTI_LINE.

textNoSuggestions

0×00080001

Can be combined with text and its variations to indicate that the IME should not show any dictionary-based word suggestions. Corresponds to TYPE_TEXT_FLAG_NO_SUGGESTIONS.

textUri

0×00000011

Text that will be used as a URI. Corresponds toTYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_URI.

textEmailAddress

0×00000021

Text that will be used as an e-mail address. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_EMAIL_ADDRESS.

textEmailSubject

0×00000031

Text that is being supplied as the subject of an e-mail. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_EMAIL_SUBJECT.

textShortMessage

0×00000041

Text that is the content of a short message. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_SHORT_MESSAGE.

textLongMessage

0×00000051

Text that is the content of a long message. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_LONG_MESSAGE.

textPersonName

0×00000061

Text that is the name of a person. Corresponds toTYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_PERSON_NAME.

textPostalAddress

0×00000071

Text that is being supplied as a postal mailing address. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_POSTAL_ADDRESS.

textPassword

0×00000081

Text that is a password. Corresponds toTYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_PASSWORD.

textVisiblePassword

0×00000091

Text that is a password that should be visible. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_VISIBLE_PASSWORD.

textWebEditText

0x000000a1

Text that is being supplied as text in a web form. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_WEB_EDIT_TEXT.

textFilter

0x000000b1

Text that is filtering some other data. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_FILTER.

textPhonetic

0x000000c1

Text that is for phonetic pronunciation, such as a phonetic name field in a contact entry. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_PHONETIC.

textWebEmailAddress

0x000000d1

Text that will be used as an e-mail address on a web form. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS.

textWebPassword

0x000000e1

Text that will be used as a password on a web form. Corresponds to TYPE_CLASS_TEXT |TYPE_TEXT_VARIATION_WEB_PASSWORD.

number

0×00000002

A numeric only field. Corresponds toTYPE_CLASS_NUMBER |TYPE_NUMBER_VARIATION_NORMAL.

numberSigned

0×00001002

Can be combined with number and its other options to allow a signed number. Corresponds toTYPE_CLASS_NUMBER |TYPE_NUMBER_FLAG_SIGNED.

numberDecimal

0×00002002

Can be combined with number and its other options to allow a decimal (fractional) number. Corresponds to TYPE_CLASS_NUMBER |TYPE_NUMBER_FLAG_DECIMAL.

numberPassword

0×00000012

A numeric password field. Corresponds toTYPE_CLASS_NUMBER |TYPE_NUMBER_VARIATION_PASSWORD.

phone

0×00000003

For entering a phone number. Corresponds toTYPE_CLASS_PHONE.

datetime

0×00000004

For entering a date and time. Corresponds toTYPE_CLASS_DATETIME |TYPE_DATETIME_VARIATION_NORMAL.

date

0×00000014

For entering a date. Corresponds toTYPE_CLASS_DATETIME |TYPE_DATETIME_VARIATION_DATE.

time

0×00000024

For entering a time. Corresponds toTYPE_CLASS_DATETIME |TYPE_DATETIME_VARIATION_TIME.

 

如此,就可以自己去在xml或代码中,分别试试,每种不同的InputType对应的都是什么效果了。

 

注意:通过代码给InputType赋值时,不是设置TYPE_XXX_VARIATION_YYY,而是要设置TYPE_CLASS_XXX | TYPE_XXXX_VARAITION_YYY

之前在代码中给InputType设置值,错写成:

?
1
inputType = InputType.TYPE_DATETIME_VARIATION_TIME;

导致,EditText点击后,不显示输入法键盘,改为正确的:

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

就可以正常的显示键盘了。

 

而后,也注意到官网

InputType | Android Developers

的解释中的示例:

A password field with with the password visible to the user:
inputType = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
A multi-line postal address with automatic capitalization:
inputType = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_POSTAL_ADDRESS | TYPE_TEXT_FLAG_MULTI_LINE
A time field:
inputType = TYPE_CLASS_DATETIME | TYPE_DATETIME_VARIATION_TIME

以及

TextView | Android Developers – android:inputType

中提示的:

“Must be one or more (separated by ‘|’) of the following constant values.”

即:

需要一个或多个值,中间通过竖杠"|"去抑或(按位或)的。

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值