it-swarm-vi.tech

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

Trong ứng dụng của mình, tôi có một EditText có loại đầu vào mặc định được đặt thành Android:inputType="textPassword" bởi deault. Nó có CheckBox ở bê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?

168
Rajkiran

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

Ngoài ra, hãy chắc chắn 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 mã sau đây

<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
295
Rajkiran

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

55
neeraj t
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?

15
ymutlu

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ì đơn InputType gán 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 Word ngắn hơn.

12
Roman Polen.
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());       
                }
            }
        });
11
G murali Madhav

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ó 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 làm ẩn trong đó.

Khi nó bị ẩ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
Debasish Ghosh

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

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
5
mav_baumer15

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

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
5
Elisabeth Whiteley

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ử đi..

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

}
});
4
Surya

Đây là trình xử lý onClick đầy đủ cho Hình ảnh/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);
        }
    };
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 từ EditText mà không cần 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 mật khẩu inputType 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
moyheen

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 TextInputEditText kết hợp với TextInputLayout

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

Thuộc tính passwordToggleEnabled sẽ làm cho việc chuyển đổi mật khẩu 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 - Có thể rút ra để sử dụng làm biểu tượng chuyển đổi hiển thị nhập mật khẩu.
[.__.] app:passwordToggleTint - Biểu tượng để sử dụng để chuyển đổi hiển thị nhập 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 . enter image description here

3
Javier Vieira

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 triển khai này giữ lại cờ TYPE_TEXT_FLAG_NO_SUGGESTIONS khi chuyển đổi giữa các chế độ.

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

Để hiển thị các ký 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);

2
Tony

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
Issac Balaji

Sau khi bạn setInputType cho trường mật khẩu, bạn sẽ có 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 sự cố 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_PASSWORD thay vì InputType.TYPE_CLASS_TEXT hoặc HideReturnsTransformationMethod vì tôi muốn bàn phím hiển thị cả văn bản và số

BẢN DEMO

2
Phan Van Linh

Tôi thay đổi loại đầu vào trên hộp kiểm của mình, vì vậy trên OnCheckedChangeListener tôi 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ư là 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
Gugadin

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.

0
sud007

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

        }
    });

Dựa trên các câu trả lời của neeraj tEverton Fernandes Rosario Tôi đã viết trong Kotlin, trong đó password là một id của 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)
    }
}
0
CoolMind

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
Z.J. Cong

Tôi sẽ xóa Android:inputType="textPassword" khỏi bố cục 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.

0
bytebender