Đặt inputType cho EditText theo chương trình?


Câu trả lời:


213

Theo các tài liệu TextView , phiên bản lập trình của android: mật khẩu là setTransaturesMethod () , không phải setInputType (). Vì vậy, một cái gì đó như:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

nên làm thủ thuật.


4
Chỉ cần thêm vào điều này, bạn cần gọi setTransaturesMethod thay vì setInputType. Việc gọi setInputType sau setTransaturesMethod khiến EditText không ở chế độ mật khẩu nữa.
Paul Ryland

11
Câu trả lời này là sai cho câu hỏi đang được hỏi. Điều này chỉ biến đổi văn bản được nhập trong EditText(thay thế các ký tự bằng dấu chấm mật khẩu). Điều này không ảnh hưởng gì đến những gì được phép nhập vào EditTextchính nó.
slinden77

4
setInputType cuối cùng gọi setTransaturesMethod từ bên trong, vì vậy nếu bạn chuyển TYPE_TEXT_VARIATION_PASSWORD để setInputType, nó sẽ thực hiện điều này cho bạn. Vấn đề dường như gặp phải khi gọi setSingleLine sau khi gọi setInputType sẽ gọi setTransaturesMethod bằng null hoặc biến áp dòng đơn do đó xóa biến áp mật khẩu.
sparkym3

sau khi gọi setTransaturesMethod (PasswordTransaturesMethod.getInstance ()) tôi không thể chỉnh sửa nó
sujith s

nhưng mật khẩu sẽ hiển thị trong văn bản được đề xuất vào lần tới khi trường được sử dụng
Gary Davies

408

Để đặt loại đầu vào cho EditText theo chương trình, bạn phải chỉ định loại lớp đầu vào là văn bản.

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

2
Mẹo của bạn làm việc hoàn hảo cho tôi! Tôi gặp vấn đề tương tự với việc lập trình kiểu đầu vào thành đa dòng.
Anna Lam

Tầm quan trọng của việc có một toán tử OR bitwise ở đây là gì? Xin lỗi, tôi mới dùng Android.
sanjeev

Tôi không đồng ý InputType.TYPE_TEXT_VariATION_PASSWORD không hoạt động đối với tôi nhưng setTransaturesMethod (PasswordTransaturesMethod.getInstance ()); làm !
Lluis Felisart

37

Dưới đây là các loại đầu vào khác nhau như được hiển thị trên bàn phím tiêu chuẩn.

loại đầu vào demo

Đặt loại đầu vào theo chương trình

editText.setInputType(InputType.TYPE_CLASS_TEXT);

Các tùy chọn khác bên cạnh TYPE_CLASS_TEXTcó thể được tìm thấy trong tài liệu .

Đặt loại đầu vào trong XML

<EditText
    android:inputType="text"
/>

Các tùy chọn khác bên cạnh textcó thể được tìm thấy trong tài liệu .

Mã bổ sung

Đây là mã cho hình ảnh trên.

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

Xem thêm


29

tôi đã giải quyết tất cả bằng

.setInputType(InputType.TYPE_CLASS_NUMBER);

để xem dữ liệu rõ ràng và

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

để xem các dấu chấm (nếu dữ liệu là một số, đó không phải là sự lựa chọn che lớp khác)


Điều này đã làm việc, cảm ơn! Một câu hỏi tho, tại sao tôi cần thêm 'hoặc' khi thay đổi từ văn bản thuần thành loại mật khẩu? Tại sao tôi không thể đơn giản làm điều này: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD);? Tôi đã thử và nó không hoạt động.
UnknownUser

15

Để chỉ cho phép số:

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

Để chuyển đổi (ẩn) mật khẩu:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// bạn có thể thay đổi TYPE _... theo yêu cầu của bạn.


5

Đối với Kotlin:

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

4

Điều này có thể giúp ích cho những người khác như tôi, những người muốn chuyển đổi giữa mật khẩu và chế độ văn bản tự do. Tôi đã thử sử dụng các phương thức nhập liệu được đề xuất nhưng nó chỉ hoạt động theo một hướng. Tôi có thể chuyển từ mật khẩu sang văn bản nhưng sau đó tôi không thể hoàn nguyên. Đối với những người đang cố gắng xử lý việc chuyển đổi (ví dụ: hộp kiểm hiển thị Mật khẩu), hãy sử dụng

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

Tôi phải ghi nhận điều này cho giải pháp. Ước gì tôi đã tìm thấy điều đó một vài giờ trước!


1

Để bỏ ẩn mật khẩu:

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

Để ẩn mật khẩu một lần nữa:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());

0

Hãy thử thêm nó vào thẻ EditText / TextView trong bố cục của bạn

android:password="true"

Chỉnh sửa: Tôi chỉ đọc lại bài viết của bạn, có lẽ bạn cần phải làm điều này sau khi xây dựng. Tôi không thấy lý do tại sao đoạn trích của bạn sẽ không hoạt động.


Tôi không có tệp bố cục trong trường hợp này, các trường đang được tạo theo chương trình.
user246114

Vâng, nó đang được thực hiện sau khi xây dựng, không biết tại sao nó cũng không hoạt động!
user246114

6
tùy chọn này hiện không được chấp nhận !!
swiftBoy

Điều này chỉ là một hoạt động cho Android 2.3 cũ, tôi đã đưa ra câu trả lời.
djdance

0

Tôi biết câu trả lời dự kiến ​​là trong Java. Nhưng đây là 2 xu lời khuyên của tôi luôn cố gắng xử lý xem nội dung liên quan trong XML(công cụ cơ bản ít nhất) vì vậy tôi sẽ đề nghị thay vì sử dụng một xmlthuộc tính thay vì xử lý trường hợp sử dụng này trongjava

    <EditText
     android:inputType="textPassword"/>

2
Trong một số trường hợp, bạn có thể muốn chuyển đổi giữa các loại đầu vào khác nhau, ví dụ như ẩn / hiển thị mật khẩu được nhập trong một trường; đó là những gì cho tôi đến trang này
William

1
nhưng đối với điều đó, có một tùy chọn trong EditText cho phép bạn hiển thị / ẩn mật khẩu mà không cần phải tự làm điều đó, nó cũng mang lại một hình ảnh động đẹp cho điều đó.
pratham kesarkar

cảm ơn về thông tin này, tôi đã thấy nó ở đây stackoverflow.com/a/41163578/3310235
William

0

Ẩn giấu:

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

Chỉ:

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

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

ngoài ra, bạn phải cẩn thận rằng con trỏ di chuyển đến điểm bắt đầu của editText sau khi hàm này được gọi, vì vậy hãy đảm bảo rằng bạn di chuyển con trỏ đến điểm cuối một lần nữa.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.