245

我们如何以编程方式设置 EditText 的输入类型?我正在努力:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

它似乎没有任何效果。

4

16 回答 16

432

要以编程方式设置 EditText 的输入类型,您必须指定输入类类型为文本。

editPass.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
于 2011-04-27T06:55:12.730 回答
224

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

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

应该做的伎俩。

于 2010-04-06T20:37:25.360 回答
70

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

输入类型演示

以编程方式设置输入类型

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;
        }
    }
}

也可以看看

于 2018-04-03T03:59:15.407 回答
35

我已经解决了所有问题

.setInputType(InputType.TYPE_CLASS_NUMBER);

查看清晰的数据和

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

看点(如果数据是数字,则不是其他类的选择)

于 2013-07-04T15:46:07.453 回答
18

只允许数字:

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

要转换(隐藏)密码:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());
于 2013-05-24T18:23:58.777 回答
8
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

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

于 2015-01-22T05:34:28.480 回答
8

对于科特林:

    val password = EditText(this)
    password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
    password.hint = "Password"
于 2019-02-07T09:15:21.980 回答
5

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

       @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");
            }
        }

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

于 2018-02-03T21:03:30.650 回答
4

要取消隐藏密码:

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

再次隐藏密码:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
于 2019-04-19T18:21:35.510 回答
2
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);

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

于 2019-08-25T15:41:04.583 回答
1

InputType 不起作用,最简单的方法是 setTransfromationMethod()

  • 显示密码

     edittextPassword.setTransformationMethod(null);
    
  • 再次隐藏密码

     edittextPassword.setTransformationMethod(new PasswordTransformationMethod());
    
于 2021-04-17T01:58:36.863 回答
0

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

android:password="true"

编辑:我刚刚重新阅读了您的帖子,也许您需要在构建后执行此操作。我不明白为什么你的片段不起作用。

于 2010-04-06T16:23:05.160 回答
0

我知道预期的答案在Java. 但这是我的 2 美分建议,总是尝试在XML(至少基本的东西)中处理与视图相关的东西,所以我建议宁愿使用xml属性而不是处理这个用例java

    <EditText
     android:inputType="textPassword"/>
于 2016-07-08T12:27:46.010 回答
0

隐藏:

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

显示:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
于 2019-07-16T16:29:06.850 回答
0
field.setInputType(InputType.TYPE_CLASS_TEXT);
于 2019-11-22T15:27:16.573 回答
0

我的回答不是这个问题的直接答案。对于大多数情况,上述任何一个答案都应该是正确的。但是,在我的情况下,它们都没有帮助。

我的项目中有一个自定义 ViewGroup,其中包含 Title 和 EditText 的文本。此 EditText 接收文本、数字、密码、电话等,具体取决于使用的案例和位置。视图组的调用者应该告诉输入类型是什么。

重要提示:设置 inputType 应该是 EditText 的最后一组(或者至少它必须在设置 EditText 的 Text 之后),否则没有效果。

在此处输入图像描述

于 2021-08-06T19:39:16.617 回答