将 android 中的 EditText 的 KeyListener 设置为 null 后将丢失输入类型选项
Restoring KeyListener of EditText in android after setting it to null loses Input Type options
我需要在接受用户输入一次后将 EditText
设置为只读。在使用 getKeyListener()
将其 KeyListener
对象保存在变量中后,我将其 KeyListener
设置为 null。但是在我使用 setKeyListener()
恢复 KeyListener 对象后 InputType
信息(例如:电子邮件、URI 等)丢失了。
public class MainActivity extends Activity {
EditText et;
KeyListener kl;
Button b;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et1);
et.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
kl = et.getKeyListener();
et.setKeyListener(null);
b = (Button) findViewById(R.id.button1);
b.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("ST","changed");
et.setKeyListener(kl);
}
});
}
}
这里我已经将 InputType
设置为 InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
但是在恢复 KeyListener
时,软键盘的类型是 TPYE_CLASS_TEXT
而不是电子邮件。
如何在将其 KeyListener
设置为 null 后获取 EditText
的先前 InputType 状态?
编辑
我在 et.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS)
之后添加了一个日志以获取 InputType 的值,我得到以下内容:
D/ST(16190): et.getInputType() : 33, et.getKeyListener().getInputType() : 1
恢复 KeyListener
后我得到以下结果:
D/ST(16190): et.getInputType() : 1 et.getKeyListener().getInputType() : 1
他们不应该一样吗?
派发的软键盘类型取决于哪个值(et.getInputType()
或et.getKeyListener().getInputType()
)?
以下应该能够在调用后阻止用户输入
et.setFocusable(false);
更合适:
et.setEnabled(false);
否则
et.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
重置密钥监听器后
fathersNameET.setKeyListener(new BaseKeyListener() {
@Override
public int getInputType() {
return 1;
}
});
fathersNameET 是您的 editText 实例名称。
谢谢
我需要在接受用户输入一次后将 EditText
设置为只读。在使用 getKeyListener()
将其 KeyListener
对象保存在变量中后,我将其 KeyListener
设置为 null。但是在我使用 setKeyListener()
恢复 KeyListener 对象后 InputType
信息(例如:电子邮件、URI 等)丢失了。
public class MainActivity extends Activity {
EditText et;
KeyListener kl;
Button b;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et1);
et.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
kl = et.getKeyListener();
et.setKeyListener(null);
b = (Button) findViewById(R.id.button1);
b.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("ST","changed");
et.setKeyListener(kl);
}
});
}
}
这里我已经将 InputType
设置为 InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
但是在恢复 KeyListener
时,软键盘的类型是 TPYE_CLASS_TEXT
而不是电子邮件。
如何在将其 KeyListener
设置为 null 后获取 EditText
的先前 InputType 状态?
编辑
我在 et.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS)
之后添加了一个日志以获取 InputType 的值,我得到以下内容:
D/ST(16190): et.getInputType() : 33, et.getKeyListener().getInputType() : 1
恢复 KeyListener
后我得到以下结果:
D/ST(16190): et.getInputType() : 1 et.getKeyListener().getInputType() : 1
他们不应该一样吗?
派发的软键盘类型取决于哪个值(et.getInputType()
或et.getKeyListener().getInputType()
)?
以下应该能够在调用后阻止用户输入
et.setFocusable(false);
更合适:
et.setEnabled(false);
否则
et.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
重置密钥监听器后
fathersNameET.setKeyListener(new BaseKeyListener() {
@Override
public int getInputType() {
return 1;
}
});
fathersNameET 是您的 editText 实例名称。
谢谢