将 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_AD‌​DRESS); 

重置密钥监听器后

fathersNameET.setKeyListener(new BaseKeyListener() {
                    @Override
                    public int getInputType() {
                        return 1;
                    }
                });

fathersNameET 是您的 editText 实例名称。

谢谢