Thay đổi theo kiểu lập trình loại đầu vào của EditText từ PASSWORD sang BÌNH THƯỜNG & ngược lại


190

Trong ứng dụng của tôi, tôi có một EditTextkiểu đầu vào mặc định được đặt thành android:inputType="textPassword"bởi deault. Nó có một CheckBoxbên phải, khi được chọn, sẽ thay đổi kiểu đầu vào của EditText thành BÌNH THƯỜNG BÌNH THƯỜNG. Mã cho đó là

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Vấn đề của tôi là, khi CheckBox đó không được chọn, nó sẽ lại đặt loại đầu vào thành PASSWORD. Tôi đã thực hiện nó bằng cách sử dụng-

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

Nhưng, văn bản bên trong edittext vẫn còn nhìn thấy được. Và thật bất ngờ, khi tôi thay đổi nguồn gốc, nó sẽ tự động đặt loại đầu vào thành PASSWORD và văn bản bên trong được gạch đầu dòng (hiển thị như mật khẩu).

Bất kỳ cách nào để đạt được điều này?


Cách đặt loại email để chỉnh sửa văn bản mailEdt.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_weB_EMAIL_ADDRESS); dường như không làm việc
Mahendran

5
Sử dụng mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);. Làm việc cho tôi.
Rajkiran

Câu trả lời:


346

Chỉ dành cho những người đang có cùng một vấn đề. Chỉ cần thêm một thuộc tính bổ sung cho EditText đó theo chương trình và bạn đã hoàn thành.

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

Đối với mật khẩu số (pin).

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

Ngoài ra, hãy đảm bảo rằng con trỏ ở cuối văn bản trong EditText. Bởi vì, khi bạn thay đổi loại đầu vào, con trỏ sẽ tự động được đặt thành điểm bắt đầu. Vì vậy, tôi đề nghị sử dụng mã sau đây:

et_password.setInputType(InputType.TYPE_CLASS_TEXT | 
    InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length());

Khi sử dụng Binding dữ liệu, bạn có thể sử dụng đoạn mã sau

<data>
        <import type="android.text.InputType"/>
.
.
.
<EditText
android:inputType='@{someViewModel.isMasked ? 
(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD) :
InputType.TYPE_CLASS_TEXT }'

Nếu sử dụng Kotlin,

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

2
như đã lưu ý cho câu trả lời đúng - thay vì thay đổi lựa chọn, bạn có thể sử dụngInputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
mente

17
Tôi không hiểu tại sao trên thế giới android chọn di chuyển con trỏ, điều đó chỉ khiến cuộc sống của các nhà phát triển khó khăn hơn nhiều.
Rafael Sanches


2
Nếu người dùng đang chỉnh sửa giữa trường mật khẩu, điều này sẽ liên tục đặt con trỏ ở cuối. Tôi khuyên bạn nên sử dụng editText.getSelectionStart()editText.getSelectionEnd()với setSelection(start, end)để tránh vấn đề này.
Chúa tể JM

1
Mọi người thậm chí không nên nhìn xa hơn. Đây là câu trả lời tốt nhất và sẽ đề nghị bạn thực hiện thay đổi được đề xuất của @JM Lord.
Đánh dấu

55

sử dụng mã này để thay đổi mật khẩu thành văn bản và ngược lại

mCbShowPwd.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // checkbox status is changed from uncheck to checked.
                if (!isChecked) {
                        // hide password
                    mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
                } else {
                        // show password
                    mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }
            }
        });

để biết mã mẫu đầy đủ, hãy tham khảo http://www.codeproject.com/Tips/518641/Show- leather-password-in-a -edit-text-view-password- type


6
HideReturnsTransaturesMethod.getInstance () đã hiển thị mật khẩu và PasswordTransaturesMethod.getInstance () ẩn mật khẩu ... triển khai là chính xác nhưng các ý kiến ​​được đảo ngược
Ahmed Adel Ismail

2
Đây là câu trả lời tốt nhất, để hoàn thành nó, chỉ cần di chuyển con trỏ đến ký tự cuối cùng với: txtpassword.setSelection (txtpassword.getText (). Length ());
Josh

Trong một khoảnh khắc, nó dường như không hoạt động do điểm được đánh dấu bởi EL-conte De-monte TereBentikh. Đề nghị Josh cũng hữu ích. Đây là câu trả lời tốt nhất.
Ajay

Thnks đơn giản và tốt nhất
Sam

1
Bạn là giáo sư, bạn của tôi! Với giải pháp này, bạn không gặp phải vấn đề với phông chữ sau khi thay đổi trở lại chế độ Mật khẩu (văn bản bảo mật).
Tzegenos

16
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);

Phương pháp trên không thực sự hiệu quả với tôi. Trả lời dưới đây hoạt động cho 2.2 sdk.

password.setTransaturesMethod (PasswordTransaturesMethod.getInstance ());

Đặt inputType cho EditText?


12

Một ví dụ đơn giản khác sử dụng ImageView để chuyển đổi mức độ hiển thị với ít mã hơn, vì chỉ định InputType, chúng ta chỉ cần toán tử đẳng thức:

EditText inputPassword = (EditText) findViewById(R.id.loginPassword);
ImageView inputPasswordShow = (ImageView) findViewById(R.id.imagePasswordShow);
inputPasswordShow.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
         if(inputPassword.getInputType() == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
              inputPassword.setInputType( InputType.TYPE_CLASS_TEXT |
                                        InputType.TYPE_TEXT_VARIATION_PASSWORD);
         }else {
              inputPassword.setInputType( InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
         }
         inputPassword.setSelection(inputPassword.getText().length());
    }
});

Thay thế:

InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

Với :

InputType.TYPE_CLASS_TEXT

Sẽ cho kết quả tương tự nhưng từ ngắn hơn.


12
Checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // checkbox status is checked.
                if (isChecked) {
                        //password is visible
 PasswordField.setTransformationMethod(HideReturnsTransformationMethod.getInstance());     
                } else {
                        //password gets hided
             passwordField.setTransformationMethod(PasswordTransformationMethod.getInstance());       
                }
            }
        });

6

Điều này làm việc cho tôi:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

Xin vui lòng đọc câu hỏi đầu tiên. Tôi muốn chuyển đổi giữa trường mật khẩu và trường văn bản. Điều này sẽ cho tôi trường văn bản số.
Rajkiran

6

Ok Vì vậy, sau nhiều giờ cố gắng cuối cùng đã thực hiện nó. Dưới đây là mã ..

  buttons.get(2).setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
       if(buttons.get(2).getText().toString().equalsIgnoreCase(getResources().getString(R.string.show))){
           editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT);
           editTexts.get(1).setSelection(editTexts.get(1).getText().length());
           buttons.get(2).setText(getResources().getString(R.string.hide));
        }else{
           editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
           //editTexts.get(1).setTransformationMethod(PasswordTransformationMethod.getInstance());
           editTexts.get(1).setSelection(editTexts.get(1).getText().length());
           buttons.get(2).setText(getResources().getString(R.string.show));
       }

    }
});

Giải thích: - Tôi có một nút có văn bản mặc định là hiển thị. Sau khi onclick sự kiện trên nó kiểm tra xem văn bản của nút có hiển thị hay không. Nếu nó được hiển thị thì thay đổi loại đầu vào, điều chỉnh vị trí con trỏ và đặt văn bản mới dưới dạng ẩn trong đó.

Khi nó được ẩn ... thực hiện ngược lại tức là ẩn mật khẩu, điều chỉnh con trỏ và đặt văn bản như hiển thị. Và đó là nó. Nó đang làm việc như một lá bùa.


6

Đối với người dùng kotlin:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

Và điều này sẽ chỉ ẩn biểu tượng mật khẩu?
CoolMind

5

Sử dụng mã này để thay đổi mật khẩu thành văn bản và ngược lại. Mã này hoàn toàn làm việc cho tôi. Thử cái này..

EditText paswrd=(EditText)view.findViewById(R.id.paswrd);

CheckBox showpass=(CheckBox)view.findViewById(R.id.showpass);
showpass.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    if(((CheckBox)v).isChecked()){
        paswrd.setInputType(InputType.TYPE_CLASS_TEXT);

    }else{
        paswrd.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
    }

}
});

Nó khác với câu trả lời được chấp nhận như thế nào? Xin vui lòng đọc câu hỏi và câu trả lời cẩn thận trước khi spam.
Rajkiran

3

Đây là trình xử lý onClick đầy đủ cho Image / Nút để hiển thị / ẩn mật khẩu.

    new OnClickListener() {
        @Override
        public void onClick(View v) {
            // current ursor position
            int cursorPosition = edtPassword.getSelectionStart();

            // toggles the control variable
            isPassworsVisible = !isPassworsVisible;

            // sets the image toggler inside edit text
            passwordVisible.setImageDrawable(getResources().getDrawable(isPassworsVisible ? R.drawable.ic_eye_checked : R.drawable.ic_eye_unchecked));

            // apply input type
            edtPassword.setInputType(isPassworsVisible ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

            // returns cursor to position
            edtPassword.setSelection(cursorPosition);
        }
    };

Cảm ơn vì edtPassword.getSelectionStart().
CoolMind

3

Tính năng Chuyển đổi Hiển thị Mật khẩu đã được thêm vào để hỗ trợ phiên bản thư viện 24.2.0 cho phép bạn chuyển mật khẩu trực tiếp EditTextmà không cần a CheckBox.

Về cơ bản, bạn có thể thực hiện công việc đó bằng cách cập nhật phiên bản thư viện hỗ trợ của mình lên 24.2.0 và sau đó đặt inputTypemật khẩu trên TextInputEditText. Đây là cách để làm điều đó:

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password"
            android:inputType="textPassword"/>
</android.support.design.widget.TextInputLayout>

Bạn có thể nhận thêm thông tin về tính năng mới trên tài liệu dành cho nhà phát triển cho TextInputLayout .


3

Kể từ khi Thư viện hỗ trợ v24.2.0. bạn có thể đạt được điều này rất dễ dàng

Những gì bạn cần làm chỉ là:

  1. Thêm thư viện thiết kế vào các cơ sở của bạn

    dependencies {
         compile "com.android.support:design:25.1.0"
    }
  2. Sử dụng TextInputEditTextkết hợp vớiTextInputLayout

    <android.support.design.widget.TextInputLayout
        android:id="@+id/etPasswordLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:passwordToggleEnabled="true">
    
        <android.support.design.widget.TextInputEditText
            android:id="@+id/etPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password_hint"
            android:inputType="textPassword"/>
    </android.support.design.widget.TextInputLayout>

passwordToggleEnabled thuộc tính sẽ làm cho mật khẩu chuyển đổi xuất hiện

  1. Trong bố cục gốc của bạn đừng quên thêm xmlns:app="http://schemas.android.com/apk/res-auto"

  2. Bạn có thể tùy chỉnh chuyển đổi mật khẩu của mình bằng cách sử dụng:

app:passwordToggleDrawable- Drawable để sử dụng làm biểu tượng chuyển đổi hiển thị đầu vào mật khẩu.
app:passwordToggleTint- Biểu tượng để sử dụng để chuyển đổi hiển thị đầu vào mật khẩu.
app:passwordToggleTintMode- Chế độ hòa trộn được sử dụng để áp dụng tông màu nền.

Thêm chi tiết trong tài liệu TextInputLayout . nhập mô tả hình ảnh ở đây


2

Tìm kiếm của tôi cho một giải pháp tương tự cho Visual Studio / Xamarin dẫn tôi đến chủ đề này. Dưới đây là những gì làm việc cho tôi với Xamarin. Lưu ý rằng việc thực hiện này giữ lại TYPE_TEXT_FLAG_NO_SUGGESTIONScờ khi chuyển đổi giữa các chế độ.

EditText et = FindViewById<EditText>(Resource.Id.ET);

Để hiển thị các nhân vật: et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;

Để ẩn các ký tự: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;

Để đặt vị trí kết thúc: int position = et.Text.Length; et.SetSelection(position, position);


Làm thế nào để sử dụng mã này if (edittext.getInputType() == (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD )){ edittext.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD ); }else{ edittext.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ); }cho Visual Studio / Xamarin ..?
sunil y

tôi có nghĩa là làm thế nào để có được kiểu đầu vào của edittext trong điều kiện if () ..?
sunil y

2

một số tình huống động holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);sẽ không hoạt động tốt hơn nên sử dụng cả hai như thế

holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());

Lưu ý: điều này phù hợp khi bạn đang sử dụng các điều khiển động như sử dụng mảng


2

Sau khi bạn setInputTypenhập trường mật khẩu, bạn sẽ gặp vấn đề với FONT
Đây là giải pháp của tôi để hiển thị / ẩn mật khẩu mà không gặp vấn đề về phông chữ

protected void onCreate(Bundle savedInstanceState) {
    ...
    findViewById(R.id.button_show_hide_password).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isPasswordVisible(edtPassword)) {
                enableInputHiddenPassword(edtPassword);
            } else {
                enableInputVisiblePassword(edtPassword);
            }
            edtPassword.setSelection(edtPassword.getText().length());
        }
    });
}

final int INPUT_TYPE_VISIBLE_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
final int INPUT_TYPE_HIDDEN_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;

private boolean isPasswordVisible(EditText editText) {
    return editText.getInputType() == INPUT_TYPE_VISIBLE_PASSWORD;
}

private void enableInputVisiblePassword(EditText editText) {
    Typeface cache = editText.getTypeface();
    editText.setInputType(INPUT_TYPE_VISIBLE_PASSWORD);
    editText.setTypeface(cache);
}

private void enableInputHiddenPassword(EditText editText) {
    Typeface cache = editText.getTypeface();
    editText.setInputType(INPUT_TYPE_HIDDEN_PASSWORD);
    editText.setTypeface(cache);
}

Lưu ý: Tôi sử dụng InputType.TYPE_TEXT_VARIATION_PASSWORDthay vì InputType.TYPE_CLASS_TEXThoặcHideReturnsTransformationMethod vì tôi muốn bàn phím hiển thị cả văn bản và số

BẢN GIỚI THIỆU


1

Tôi sẽ loại bỏ android:inputType="textPassword"khỏi bố trí của bạn. Đó là lý do tại sao nó đang chuyển trở lại mật khẩu khi định hướng thay đổi. Bởi vì mỗi lần định hướng thay đổi, chế độ xem sẽ được tạo lại.

Đối với vấn đề đầu tiên hãy thử điều này:

String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);

về cơ bản làm trống văn bản trước khi bạn thay đổi loại đầu vào và sau đó thêm nó trở lại.


Không làm việc. Tôi thậm chí đã thử đặt password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);ngay sau khi khởi tạo, nhưng than ôi!
Rajkiran

1

Hoàn thành mã khi bạn muốn áp dụng khả năng hiển thị Mật khẩu trong văn bản chỉnh sửa Mật khẩu.

Tạo một tay cầm [Bất kỳ có thể vẽ hoặc Hộp kiểm]

khi nhấp hoặc vào Đã kiểm tra / Bỏ chọn hãy viết này:

 if (edittext.getInputType() == (InputType.TYPE_CLASS_TEXT |
                    InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD )){

                edittext.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_PASSWORD );
            }else{
                edittext.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
            }

Đừng quên viết dòng này:

 edittext.setSelection(edittext.getText().length());

Nó đặt lại con trỏ đến cuối dòng.


@PKR kiểm tra người bạn thực hiện, trong trường hợp này đã sẵn sàng để sử dụng! :)
sud007

@ sud007 bạn có biết làm thế nào để viết điều kiện if trong Xamarin / visual Studio không ..?
sunil y

1

Tôi thay đổi loại đầu vào trên hộp kiểm của mình, vì vậy OnCheckedChangeListenertôi sẽ làm:

passwordEdit.setInputType(InputType.TYPE_CLASS_TEXT| (isChecked? InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));

Và cuối cùng nó đã làm việc.

Có vẻ như một vấn đề boolean với TYPE_TEXT_VARIATION_VISIBLE_PASSWORD. Đảo ngược cờ và nó sẽ khắc phục vấn đề.

Trong trường hợp của bạn:

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

1

Sử dụng phương pháp chuyển đổi:

Trốn:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

Để hiển thị:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

Đó là nó.


0

Chỉ cần một nhận xét bổ sung về câu trả lời đúng được cung cấp bởi @Rajkiran, bạn có thể muốn thêm

etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

đến trạng thái nhập BÌNH THƯỜNG để người dùng không bị làm phiền bởi đề xuất tự động của bàn phím


0

Blockquote

int cuối cùng [] tính = {0};

    showandhide.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(count[0] ==0)
            {
                password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
                count[0]++;
            }
            else {

                password.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_PASSWORD);
                showandhide.setText("Hide");
                count[0]--;
            }

        }
    });

0

Dựa trên câu trả lời của neeraj tEverton Fernandes Rosario tôi đã viết trong Kotlin, nơi passwordcó id của một EditText trong bố cục của bạn.

// Show passwords' symbols.
private fun showPassword() {
    password.run {
        val cursorPosition = selectionStart
        transformationMethod = HideReturnsTransformationMethod.getInstance()
        setSelection(cursorPosition)
    }
}

// Show asterisks.
private fun hidePassword() {
    password.run {
        val cursorPosition = selectionStart
        transformationMethod = PasswordTransformationMethod.getInstance()
        setSelection(cursorPosition)
    }
}
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.