如何以编程方式为EditText设置输入类型?

257

我们如何在EditText中编程设置输入类型?我尝试了:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

看起来它没有任何影响。

17个回答

447

要在程序中设置EditText的输入类型,您需要指定该输入类别为文本。

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

2
你的提示对我非常有效!我遇到了一个类似的问题,需要以编程方式将输入类型设置为多行。 - Anna Lam
在这里使用按位或运算符有什么意义?抱歉,我是Android的新手。 - sanjeev
1
我不同意InputType.TYPE_TEXT_VARIATION_PASSWORD对我有效,但setTransformationMethod(PasswordTransformationMethod.getInstance())却有效! - from56

226

根据TextView文档,android:password的编程版本是setTransformationMethod(),而不是setInputType()。因此,类似以下代码:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

应该就可以解决问题了。


4
补充一下,你需要调用setTransformationMethod而不是setInputType。在调用setTransformationMethod之后再调用setInputType会导致EditText不能再次处于密码模式。 - Dwighte
13
这个答案与所问问题不符。它只是将在“EditText”中输入的文本转换为密码点。这对于允许在“EditText”中输入什么没有任何影响。 - slinden77
4
setInputType最终从内部调用setTransformationMethod,所以如果你将TYPE_TEXT_VARIATION_PASSWORD传递给setInputType,它会替你完成此操作。问题似乎在于在调用setInputType之后调用setSingleLine,这将使用null或单行转换器调用setTransformationMethod,从而清除密码转换器。 - sparkym3
调用 setTransformationMethod(PasswordTransformationMethod.getInstance()) 后,我无法编辑它。 - sujith s
但是密码将会在下次使用该字段时出现在建议文本中。 - Gary Davies

84

这里展示了标准键盘上的各种输入类型。

input types demo

以编程方式设置输入类型

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

另请参见


1
感谢 InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL 用于十进制数! - CoolMind
第一行的类型是数字,其余为文本? - Sanoj Kashyap

36
我已经解决了所有问题
.setInputType(InputType.TYPE_CLASS_NUMBER);

查看清晰的数据并且

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

观察小圆点(如果数据是数字,则不选择其他类别)


这个有效,谢谢!不过我有一个问题,为什么在从普通文本更改为密码类型时需要添加“or”?为什么不能简单地这样做:.setInputType(InputType.TYPE_NUMBER_VARIATION_PASSWORD)?我尝试了一下,但没有起作用。 - UnknownUser

20

仅允许输入数字:

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

将密码转换(隐藏):

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());

10

对于Kotlin:

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

9
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

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

6

这可能对像我一样希望在密码和自由文本模式之间切换的其他人有所帮助。我尝试使用推荐的输入方法,但只能单向工作。我可以从密码转换为文本,但无法恢复。对于那些尝试处理切换(例如显示密码复选框)的人,请使用

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

我必须感谢这个解决方案。真希望我几小时前就找到它了!


6
显示密码:
editText.setInputType(
      InputType.TYPE_CLASS_TEXT|
      InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
);

再次隐藏密码的方法如下:
editText.setTransformationMethod(PasswordTransformationMethod.getInstance());

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

同时,您需要注意到在调用此函数后光标会移动到编辑框的起始位置,因此请确保您再次将光标移至末尾。

原始答案:最初的回答


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接