是否以编程方式设置EditText的inputType?


Answers:


213

根据TextView文档,android:password的编程版本为setTransformationMethod(),而不是setInputType()。所以像这样:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

应该可以。


4
只需添加此内容,您需要调用setTransformationMethod 而不是 setInputType。在setTransformationMethod之后调用setInputType会使EditText不再处于密码模式。
Paul Ryland

11
这个答案对于所问的问题是错误的。这仅会转换EditText(中的字符替换为密码点)中输入的文本。这对允许自己输入的内容没有任何影响EditText
slinden77

4
setInputType最终会从内部调用setTransformationMethod,因此,如果您将TYPE_TEXT_VARIATION_PASSWORD传递给setInputType,它将为您完成此操作。在调用setInputType之后调用setSingleLine似乎很麻烦,它将使用null或单行转换器调用setTransformationMethod,从而清除了密码转换器。
sparkym3 2015年

在调用setTransformationMethod(PasswordTransformationMethod.getInstance())之后,我无法对其进行编辑
sujith s 2015年

但下次使用该字段时,密码将显示在建议的文本中
Gary Davies

408

为了以编程方式设置EditText的输入类型,必须指定输入类的类型为text。

editPass.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

2
您的小费对我来说很完美!我通过编程将输入类型设置为多行时遇到了类似的问题。
安娜·林

在这里使用按位或运算符有什么意义?抱歉,我是android新手。
sanjeev

我不同意InputType.TYPE_TEXT_VARIATION_PASSWORD对我不起作用,但setTransformationMethod(PasswordTransformationMethod.getInstance()); 确实!
Lluis Felisart

37

这是标准键盘上显示的各种输入类型。

输入类型演示

以编程方式设置输入类型

editText.setInputType(InputType.TYPE_CLASS_TEXT);

除了其他选项,TYPE_CLASS_TEXT可以在文档中找到。

在XML中设置输入类型

<EditText
    android:inputType="text"
/>

除了其他选项,text可以在文档中找到。

补充代码

这是上面图像的代码。

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;
    List<InputTypeItem> inputTypes;
    int counter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);
        initArray();
    }

    public void onChangeInputTypeButtonClick(View view) {
        if (counter >= inputTypes.size()) {
            startOver();
            return;
        }
        textView.setText(inputTypes.get(counter).name);
        editText.setInputType(inputTypes.get(counter).value);
        editText.setSelection(editText.getText().length());
        counter++;
    }

    private void startOver() {
        counter = 0;
        textView.setText("");
        editText.setInputType(InputType.TYPE_CLASS_TEXT);
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }


    private void initArray() {
        inputTypes = new ArrayList<>();
        inputTypes.add(new InputTypeItem("date",  InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE));
        inputTypes.add(new InputTypeItem("datetime", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("none", InputType.TYPE_NULL));
        inputTypes.add(new InputTypeItem("number",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("numberDecimal",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL));
        inputTypes.add(new InputTypeItem("numberPassword",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("numberSigned", InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED));
        inputTypes.add(new InputTypeItem("phone",  InputType.TYPE_CLASS_PHONE));
        inputTypes.add(new InputTypeItem("text",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("textAutoComplete", InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE));
        inputTypes.add(new InputTypeItem("textAutoCorrect",  InputType.TYPE_TEXT_FLAG_AUTO_CORRECT));
        inputTypes.add(new InputTypeItem("textCapCharacters",  InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS));
        inputTypes.add(new InputTypeItem("textCapSentences",  InputType.TYPE_TEXT_FLAG_CAP_SENTENCES));
        inputTypes.add(new InputTypeItem("textCapWords",  InputType.TYPE_TEXT_FLAG_CAP_WORDS));
        inputTypes.add(new InputTypeItem("textEmailAddress",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textEmailSubject", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT));
        inputTypes.add(new InputTypeItem("textFilter",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER));
        inputTypes.add(new InputTypeItem("textLongMessage",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE));
        inputTypes.add(new InputTypeItem("textMultiLine",  InputType.TYPE_TEXT_FLAG_MULTI_LINE));
        inputTypes.add(new InputTypeItem("textNoSuggestions", InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
        inputTypes.add(new InputTypeItem("textPassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("textPersonName", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME));
        inputTypes.add(new InputTypeItem("textPhonetic",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC));
        inputTypes.add(new InputTypeItem("textPostalAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS));
        inputTypes.add(new InputTypeItem("textShortMessage", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE));
        inputTypes.add(new InputTypeItem("textUri",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI));
        inputTypes.add(new InputTypeItem("textVisiblePassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
        inputTypes.add(new InputTypeItem("textWebEditText",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT));
        inputTypes.add(new InputTypeItem("textWebEmailAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textWebPassword", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD));
        inputTypes.add(new InputTypeItem("time", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME));
    }

    class InputTypeItem {
        private String name;
        private int value;
        InputTypeItem(String name, int value) {
            this.name = name;
            this.value = value;
        }
    }
}

也可以看看


29

我已经解决了所有

.setInputType(InputType.TYPE_CLASS_NUMBER);

用于查看清晰的数据和

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

用于查看点(如果数据是数字,则不能选择其他类)


这行得通,谢谢!一个问题,从纯文本更改为密码类型时,为什么需要添加“或”?为什么我不能简单地这样做:.setInputType(InputType.TYPE_NUMBER_VARIATION_PASSWORD);?我尝试了,但没有成功。
UnknownUser

15

只允许数字:

password1.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_CLASS_NUMBER);

转换(隐藏)密码:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

//您可以根据需要更改TYPE_...。


5

对于Kotlin:

    val password = EditText(this)
    password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
    password.hint = "Password"

4

这可能对像我这样想在密码和自由文本模式之间切换的其他人有所帮助。我尝试使用建议的输入法,但仅在一个方向上起作用。我可以从密码输入文本,但后来无法恢复。对于试图处理切换的用户(例如,显示密码复选框),请使用

       @Override
        public void onClick(View v)
        {
            if(check.isChecked())
            {
                edit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                Log.i(TAG, "Show password");
            }
            else
            {
                edit.setTransformationMethod(PasswordTransformationMethod.getInstance());
                Log.i(TAG, "Hide password");
            }
        }

我必须将此归功于解决方案。希望我几个小时前发现了!


1

取消隐藏密码:

editText.setInputType(
      InputType.TYPE_CLASS_TEXT|
      InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
);

要再次隐藏密码:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());

0

尝试将其添加到布局中的EditText / TextView标记中

android:password="true"

编辑:我只是重新阅读了您的文章,也许您需要在构建后执行此操作。我不明白为什么您的代码段无效。


在这种情况下,我没有布局文件,这些字段是通过编程方式生成的。
user246114'4

是的,它是在施工后完成的,不确定为什么它也不起作用!
user246114'4

6
现在不推荐使用此选项!
swiftBoy 2012年

这个东西只是一个适用于旧android 2.3的东西,我赞成这个答案。
djdance

0

我知道预期的答案在中Java。但是,这是我的2美分建议,总是尝试使用XML(至少基本的东西)处理与视图相关的内容,因此,我建议使用xml属性而不是在java

    <EditText
     android:inputType="textPassword"/>

2
在某些情况下,您可能需要在不同的输入类型之间切换,例如隐藏/显示在字段中输入的密码;这就是让我转到此页面的地方
William

1
但为此,EditText中提供了一个选项,让您无需隐藏密码即可显示/隐藏密码,而且还为此提供了很好的动画效果。
普拉瑟姆·凯萨卡

感谢您的信息,我在这里看到了stackoverflow.com/a/41163578/3310235
William

0

隐藏:

edtPassword.setInputType(InputType.TYPE_CLASS_TEXT);
edtPassword.setTransformationMethod(null);

表演:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());

0
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);

另外,在调用此函数后,还必须注意光标会移至editText的起点,因此请确保再次将光标移至终点。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.