摘要:alertdialog中加入edittext但是不弹出软键盘等问题网上有很多不管用的解决方案,

本文意在给出更有效的解决办法,并初步探究其原因

正文

在对话框中插入文本框是十分常见的需求

通常我们选择在代码中创建edittext对象

这个时候就需要在代码中给edittext设置输入属性了

但是经常发现设置的属性不起作用,甚至都不弹出软键盘(虽然实体键盘可以输入)

问题的解决方案有很多种,这里介绍一种我比较常用的方法:

inputPassEditText.setInputType(InputType.TYPE_CLASS_TEXT|InputType.XXX);

就是在设置输入type的时候,按位或上一个inputtype.TYPE_CLASS_TEXT

它在16进制中是0x80

例如一个密码输入对话框可以这么写

AlertDialog.Builder builder = new  AlertDialog.Builder(MainActivity.this);
final EditText inputPassEditText = new EditText(MainActivity.this);
builder.setView(inputPassEditText); //输入框是密码风格的
inputPassEditText.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);

这样不仅解决了软键盘不弹出的问题,而且也得到了预期的输入效果.

问题解决.

=========================华丽分割线,下面更精彩===================================

其实InputType是android当中的一个类

android.text.InputType

这个类并没有什么方法,只有几十个静态常量

TYPE_CLASS_TEXT就是其中最常用的一个

以TYPE_CLASS开头的常量共有这四种

int TYPE_CLASS_DATEtIME

int TYPE_CLASS_NUMBER

int TYPE_CLASS_PHONE

int TYPE_CLASS_TEXT

Examples它们的用法示例

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

可见google的api暴露给我们的用法就是利用CLASS与FLAG等按位或来达到想要的效果(google精心设计了每个常量的2进制位)

这里我给出两个常用的例子:

输入数字密码

inputPassEditText.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_VARIATION_PASSWORD);

输入数字明文:

inputPassEditText.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_VARIATION_NORMAL);

具体的用法还有很多,在此就不一一列举了,有兴趣的读者可以去查阅google文档.

04-15 06:49