Cách chuyển đổi giữa ẩn và xem mật khẩu


176

Có cách nào thông minh để cho phép người dùng chuyển đổi giữa ẩn và xem mật khẩu trong Android EditText không? Một số ứng dụng dựa trên PC cho phép người dùng làm điều này.

Câu trả lời:


155

Bạn có thể tự động thay đổi các thuộc tính của TextView. Nếu bạn đặt Thuộc tính XML android:passwordthành đúng, chế độ xem sẽ hiển thị dấu chấm nếu bạn đặt thành sai, văn bản được hiển thị.

Với phương thức setTransaturesMethod, bạn sẽ có thể thay đổi các thuộc tính này từ mã. (Tuyên bố miễn trừ trách nhiệm: Tôi chưa kiểm tra nếu phương thức vẫn hoạt động sau khi chế độ xem được hiển thị. Nếu bạn gặp vấn đề với điều đó hãy để lại cho tôi một nhận xét để tôi biết.)

Mã mẫu đầy đủ sẽ là

yourTextView.setTransformationMethod(new PasswordTransformationMethod());

để ẩn mật khẩu. Để hiển thị mật khẩu, bạn có thể đặt một trong các phương thức chuyển đổi hiện có hoặc triển khai TransformMethod trống không làm gì với văn bản đầu vào.

yourTextView.setTransformationMethod(new DoNothingTransformation());

61
Để hiển thị mật khẩu, bạn không cần tạo bất kỳ lớp mới nào. Chỉ cần gọi setTransformationMethod(null).
Matt Quigley

4
@Janusz, sử dụng sau đây sẽ cho giải pháp gud. setTransaturesMethod (PasswordTransaturesMethod.getInstance ()); và setTransaturesMethod (HideReturnsTransaturesMethod.getInstance ());
sujith s

@Janusz nhưng làm thế nào để lấy phím show / ẩn trong bàn phím?
Narendra Singh

khi gọi setTransaturesMethod trên EditeText, cuộc gọi lại onTextChanged của EditText đang được gọi ... có phải điều này không xảy ra không?
tsiro

1
Chính xác. "SetTransaturesMethod () là khóa. Tất cả những gì bạn cần là chuyển đổi trong trình nghe của bạn: etPassword.setTransaturesMethod (null) / etPassword.setTransaturesMethod (new PasswordTransifyingMethod ()). Theo mặc định, hãy đặt trong xml của bạn" ""
Sergio

303

Nó thực sự dễ dàng để đạt được kể từ Thư viện hỗ trợ v24.2.0.

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:24.2.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:layout_marginBottom="@dimen/login_spacing_bottom">
    
        <android.support.design.widget.TextInputEditText
            android:id="@+id/etPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/fragment_login_password_hint"
            android:inputType="textPassword"/>
    </android.support.design.widget.TextInputLayout>

Các passwordToggleEnabledthuộc tính sẽ làm công việc!

  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

Dành cho AndroidX

  • Thay thế android.support.design.widget.TextInputLayoutbằngcom.google.android.material.textfield.TextInputLayout

  • Thay thế android.support.design.widget.TextInputEditTextbằngcom.google.android.material.textfield.TextInputEditText


Trong phiên bản 25.1.0 tôi có một hành vi kỳ lạ: nó hiển thị mật khẩu được chuyển đổi một lần nhưng nếu bạn nhấn nó, nó sẽ biến mất o_O '
MiguelHincapieC

1
Vâng, cũng có một số quirks với android:textthuộc tính trên TextInputEditText. Bạn luôn có thể nêu vấn đề trên Trình theo dõi sự cố của Google cho Android
mmBs

1
@ Delta7 Có một số cách và cách giải quyết. Xin vui lòng, đặt câu hỏi trên SO, dán một liên kết ở đây và tôi sẽ cố gắng giúp bạn.
mmBs

1
Cảm ơn. Tuy nhiên, trong bản dựng của tôi, đồ họa hiển thị / ẩn bị đảo ngược một cách kỳ lạ so với ảnh chụp màn hình của bạn - nó hiển thị mắt lác khi mật khẩu bị ẩn - Tôi đoán ai đó đã quyết định các nút sẽ hiển thị trạng thái hiện tại thay vì trạng thái hành động (hoặc trạng thái mục tiêu).
Josh Sutterfield

1
@JoshSutterfield đồng ý. Vì vậy, nếu chúng ta muốn nút hành động, chúng ta phải đảo ngược nó bằng tay bằng cách sử dụng app:passwordToggleDrawable(không dùng nữa) hoặc app:endIconDrawablesau đó sử dụng tùy chỉnh drawable như <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_eye_close" android:state_checked="true"/> <item android:drawable="@drawable/ic_eye_open"/> </selector> tôi nghĩ google nên khắc phục hành vi này. Thảo luận tốt
Rahmat Ihsan

112

Để hiển thị các dấu chấm thay vì mật khẩu, hãy đặt PasswordTransaturesMethod:

yourEditText.setTransformationMethod(new PasswordTransformationMethod());

tất nhiên bạn có thể đặt mặc định này trong phần tử edittext của mình trong bố cục xml với

android:password

Để hiển thị lại mật khẩu có thể đọc được, chỉ cần chuyển null thành phương thức chuyển đổi:

yourEditText.setTransformationMethod(null);

7
android:passwordbây giờ không được dùng nữa và bạn nên sử dụng android:inputTypethay thế.
Wilka

54
Bạn cũng có thể làm cho người dùng của mình hài lòng bằng cách lưu vị trí con trỏ trước khi đặt phương thức chuyển đổi và khôi phục sau đó. Sử dụng editText.getSelectionStart()editText.getSelectionEnd()để lưu vị trí con trỏ và editText.setSelection(start, end)khôi phục nó.
Mostafa

2
@Wilka: android: inputType KHÔNG cho phép bạn chuyển đổi qua lại giữa hai trạng thái trong thời gian chạy. Nó chỉ cho phép bạn chuyển đổi một lần và một khi bạn thay đổi nó, bạn không thể thay đổi lại. Và không, setTransaturesMethod KHÔNG được dùng nữa.
AndroidDev

@Qlimax nhưng làm thế nào để lấy phím show / ẩn trong bàn phím?
Narendra Singh

@DroidWormNarendra bạn thường đính kèm một trình lắng nghe sự kiện vào một "hình ảnh mắt" giữa đầu vào mật khẩu của bạn, hoặc bên trong mật khẩu của bạn như được giải thích ở đây: stackoverflow.com/questions/3554377/ . Sau đó, trong sự kiện này, bạn có thể hiển thị / ẩn mật khẩu. AFAIK không thể có một số phím hiển thị / ẩn trong bàn phím
Qlimax

82

Để hiển thị:

editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Trốn:

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

Sau mỗi lần này, con trỏ được đặt lại, vì vậy:

editText.setSelection(editText.length());

Đã thử nghiệm trên Android 4.3 & 5.0, hoạt động rất tốt! Tài liệu làm cho nó trông như thế này sẽ hoạt động hoàn toàn theo API 3.
James

@MattLogan nhưng làm thế nào để lấy phím show / ẩn trong bàn phím?
Narendra Singh

5
Đây là câu trả lời thẳng nhất ở đây. Cảm ơn. (lạ là nó không phải là thứ được chấp nhận)
Tina

Điều này dường như không hoạt động khi thay đổi trong thời gian chạy. Nó cũng sẽ không khôi phục vị trí / lựa chọn con trỏ cuối cùng của người dùng nếu không ở cuối dòng.
Tom

31

Bạn có thể dùng app:passwordToggleEnabled="true"

đây là ví dụ được đưa ra dưới đây

<android.support.design.widget.TextInputLayout
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:passwordToggleEnabled="true"
        android:textColorHint="@color/colorhint"
        android:textColor="@color/colortext">

Hôm nay nó phải được ưu tiên sử dụng câu trả lời
Ruslan Berozov

Điều đó làm tăng chiều cao của khung nhìn trong trường hợp của tôi. Có cách nào để loại bỏ phần đệm khỏi chuyển đổi drawable.
Sadda Hussain

Điều này không được chấp nhận trong các thành phần vật chất. Sử dụng app:endIconMode="password_toggle".
Nicolas

13

Sử dụng hộp kiểm và thay đổi loại đầu vào cho phù hợp.

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    int start,end;
    Log.i("inside checkbox chnge",""+isChecked);
    if(!isChecked){
        start=passWordEditText.getSelectionStart();
        end=passWordEditText.getSelectionEnd();
        passWordEditText.setTransformationMethod(new PasswordTransformationMethod());;
        passWordEditText.setSelection(start,end);
    }else{
        start=passWordEditText.getSelectionStart();
        end=passWordEditText.getSelectionEnd();
        passWordEditText.setTransformationMethod(null);
        passWordEditText.setSelection(start,end);
    }
}

8
private boolean isPasswordVisible;

private TextInputEditText firstEditText;

...

firstEditText = findViewById(R.id.et_first);

...

    private void togglePassVisability() {
    if (isPasswordVisible) {
        String pass = firstEditText.getText().toString();
        firstEditText.setTransformationMethod(PasswordTransformationMethod.getInstance());
        firstEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        firstEditText.setText(pass);
        firstEditText.setSelection(pass.length());           
    } else {
        String pass = firstEditText.getText().toString();
        firstEditText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        firstEditText.setInputType(InputType.TYPE_CLASS_TEXT);
        firstEditText.setText(pass);
        firstEditText.setSelection(pass.length());
    }
    isPasswordVisible= !isPasswordVisible;
}

Không cần thiết lập lại văn bản, chỉ gọi FirstEditText.invalidate ();
Gunavant Patel

7

Nó làm việc cho tôi. Điều này sẽ giúp bạn chắc chắn

showpass.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(!isChecked){

                    // show password
                    password_login.setTransformationMethod(PasswordTransformationMethod.getInstance());

                    Log.i("checker", "true");
                }

                else{
                    Log.i("checker", "false");

                     // hide password
    password_login.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }

            }
        });

5

Tôi cảm thấy tôi muốn trả lời câu hỏi này ngay cả khi có một số câu trả lời hay,

theo tài liệu TransformMethod thực hiện nhiệm vụ của chúng tôi

Biến đổi

TextView sử dụng TransformMethod để thực hiện những việc như thay thế các ký tự của mật khẩu bằng dấu chấm hoặc giữ cho các ký tự dòng mới không gây ra ngắt dòng trong các trường văn bản một dòng.

Lưu ý tôi sử dụng dao bơ, nhưng nó cũng tương tự nếu người dùng kiểm tra mật khẩu hiển thị

@OnCheckedChanged(R.id.showpass)
    public void onChecked(boolean checked){
        if(checked){
            et_password.setTransformationMethod(null);
        }else {
            et_password.setTransformationMethod(new PasswordTransformationMethod());
            
        }
       // cursor reset his position so we need set position to the end of text
        et_password.setSelection(et_password.getText().length());
    }

5

Tôi có thể thêm mã ShowPassword / HidePassword chỉ bằng một vài dòng, khép kín trong một khối:

protected void onCreate(Bundle savedInstanceState) {
    ...
    etPassword = (EditText)findViewById(R.id.password);
    etPassword.setTransformationMethod(new PasswordTransformationMethod()); // Hide password initially

    checkBoxShowPwd = (CheckBox)findViewById(R.id.checkBoxShowPwd);
    checkBoxShowPwd.setText(getString(R.string.label_show_password)); // Hide initially, but prompting "Show Password"
    checkBoxShowPwd.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton arg0, boolean isChecked) {
            if (isChecked) {
                etPassword.setTransformationMethod(null); // Show password when box checked
                checkBoxShowPwd.setText(getString(R.string.label_hide_password)); // Prompting "Hide Password"
            } else {
                etPassword.setTransformationMethod(new PasswordTransformationMethod()); // Hide password when box not checked
                checkBoxShowPwd.setText(getString(R.string.label_show_password)); // Prompting "Show Password"
            }
        }
    } );
    ...

5

Tôi đã có cùng một vấn đề và nó rất dễ thực hiện.

Tất cả những gì bạn phải làm là bọc trường EditText của bạn trong một (com.google.android.m vật.textfield.TextInputLayout) và trong đó thêm (app: passwordToggleEnabled = "true").

Điều này sẽ hiển thị mắt trong trường EditText và khi bạn nhấp vào nó, mật khẩu sẽ xuất hiện và biến mất khi nhấp lại.

<com.google.android.material.textfield.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:textColorHint="#B9B8B8"
                app:passwordToggleEnabled="true">

                <EditText
                    android:id="@+id/register_password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="24dp"
                    android:layout_marginRight="44dp"
                    android:backgroundTint="#BEBEBE"
                    android:hint="Password"
                    android:inputType="textPassword"
                    android:padding="16dp"
                    android:textSize="18sp" />
            </com.google.android.material.textfield.TextInputLayout>

4
private int passwordNotVisible=1; 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
 showPassword = (ImageView) findViewById(R.id.show_password);
    showPassword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditText paswword = (EditText) findViewById(R.id.Password);
            if (passwordNotVisible == 1) {
                paswword.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                passwordNotVisible = 0;
            } else {

                paswword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                passwordNotVisible = 1;
            }


            paswword.setSelection(paswword.length());

        }
    });
}

4

Ở dạng rất đơn giản:

private fun updatePasswordVisibility(editText: AppCompatEditText) {
        if (editText.transformationMethod is PasswordTransformationMethod) {
            editText.transformationMethod = null
        } else {
            editText.transformationMethod = PasswordTransformationMethod()
        }
        editText.setSelection(editText.length())
    }

Hy vọng nó giúp.


3

Bạn có thể HIỂN THỊ / ẩn mật khẩu bằng mã dưới đây:

MÃ XML:

<EditText
        android:id="@+id/etPassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="21dp"
        android:layout_marginTop="14dp"
        android:ems="10"
        android:inputType="textPassword" >
        <requestFocus />
    </EditText>
    <CheckBox
        android:id="@+id/cbShowPwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/etPassword"
        android:layout_below="@+id/etPassword"
        android:text="@string/show_pwd" />

MÃ JAVA:

EditText mEtPwd;
CheckBox mCbShowPwd;


mEtPwd = (EditText) findViewById(R.id.etPassword);
mCbShowPwd = (CheckBox) findViewById(R.id.cbShowPwd);

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

3

Thử cái này:

Đầu tiên xác định một cờ là toàn cầu như thế này:

private boolean isShowPassword = false;

Và đặt trình nghe để xử lý nhấn vào hiển thị và ẩn nút mật khẩu:

imgPassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isShowPassword) {
                    etPassword.setTransformationMethod(new PasswordTransformationMethod());
                    imgPassword.setImageDrawable(getResources().getDrawable(R.drawable.ic_eye_hide));
                    isShowPassword = false;
                }else{
                    etPassword.setTransformationMethod(null);
                    imgPassword.setImageDrawable(getResources().getDrawable(R.drawable.ic_eye_show));
                    isShowPassword = true;
                }
            }
        });

2

Hãy thử https://github.com/maksim88/PasswordEditText dự án tại github. Bạn thậm chí không cần thay đổi mã Java của mình bằng cách sử dụng nó. Chỉ là sự thay đổi

Chỉnh sửa văn bản

gắn thẻ

com.maksim88.passwordedittext.PasswordEditText

trong tệp XML của bạn.


Bạn có biết cách sử dụng setError với thành phần này không, khi lỗi được gắn cờ biểu tượng hiển thị / ẩn trở nên vô hình
guisantogui

2

hiển thị và ẩn mật khẩu Edit_Text với hộp kiểm

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:inputType="textPassword"
        android:id="@+id/edtPass"
        android:textSize="20dp"
        android:hint="password"
        android:padding="20dp"
        android:background="#efeaea"
        android:layout_width="match_parent"
        android:layout_margin="20dp"
        android:layout_height="wrap_content" />

    <CheckBox
        android:background="#ff4"
        android:layout_centerInParent="true"
        android:textSize="25dp"
        android:text="show password"
        android:layout_below="@id/edtPass"
        android:id="@+id/showPassword"
        android:layout_marginTop="20dp"
        android:layout_width="wrap_content"
        android:gravity="top|right"
        android:layout_height="wrap_content" />

</RelativeLayout>

mã java

package com.example.root.sql2;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatCheckBox;
import android.support.v7.widget.Toolbar;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;

public class password extends AppCompatActivity {


    EditText password;
    CheckBox show_hide_password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hide);
        findViewById();
        show_hide_pass();



    }//end onCreate



    public void show_hide_pass(){
        show_hide_password.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if (!b){
                    // hide password
                    password.setTransformationMethod(PasswordTransformationMethod.getInstance());

                }else{
                    // show password
                    password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }
            }
        });
    } // end show_hide_pass




    public void findViewById(){ //  find ids ui and
        password = (EditText) findViewById(R.id.edtPass);
        show_hide_password = (CheckBox) findViewById(R.id.showPassword);
    }//end findViewById



}// end class

2

Bạn đã thử với setTransaturesMethod chưa? Nó được kế thừa từ TextView và muốn một TransformMethod làm tham số.

Bạn có thể tìm hiểu thêm về TransformMethods tại đây .

Nó cũng có một số tính năng thú vị, như thay thế nhân vật.


2
Liên kết trong câu trả lời đã chết - "Mã trạng thái: 404 Không tìm thấy" .
Pang

developer.android.com/reference/android/text/method/ Có thể là một url tốt hơn cho thông tin về Phương thức chuyển đổi của Android.
Mr.Drew

1

Những gì tôi đã làm là

  1. Tạo chế độ xem văn bản chỉnh sửa và chế độ xem văn bản bình thường
  2. Làm cho chúng trùng nhau với nhau bằng cách sử dụng bố cục ràng buộc (giống như màn hình đăng nhập ứng dụng Facebook)
  3. Đính kèm onClickListener vào chế độ xem văn bản thông thường để nó thay đổi loại đầu vào của chế độ xem văn bản chỉnh sửa cho phù hợp (Hiển thị / Không hiển thị)

Bạn có thể xem video này để biết các bước và giải thích chi tiết hơn https://youtu.be/md3eVaRzdIM

Hy vọng nó giúp :)


1

Đây là giải pháp của tôi mà không cần sử dụng phương thức TextInputEditText và Transform.

XML

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            style="@style/FormLabel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/username" />

        <EditText
            android:id="@+id/loginUsername"
            style="@style/EditTextStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/ic_person_outline_black_24dp"
            android:drawableStart="@drawable/ic_person_outline_black_24dp"
            android:inputType="textEmailAddress"
            android:textColor="@color/black" />

        <TextView
            style="@style/FormLabel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@string/password" />

        <EditText
            android:id="@+id/loginPassword"
            style="@style/EditTextStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:drawableEnd="@drawable/ic_visibility_off_black_24dp"
            android:drawableLeft="@drawable/ic_lock_outline_black_24dp"
            android:drawableRight="@drawable/ic_visibility_off_black_24dp"
            android:drawableStart="@drawable/ic_lock_outline_black_24dp"
            android:inputType="textPassword"
            android:textColor="@color/black" />
    </LinearLayout>

Mã Java

boolean VISIBLE_PASSWORD = false;  //declare as global variable befor onCreate() 
loginPassword = (EditText)findViewById(R.id.loginPassword);
loginPassword.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            final int DRAWABLE_LEFT = 0;
            final int DRAWABLE_TOP = 1;
            final int DRAWABLE_RIGHT = 2;
            final int DRAWABLE_BOTTOM = 3;

            if (event.getAction() == MotionEvent.ACTION_UP) {
                if (event.getRawX() >= (loginPassword.getRight() - loginPassword.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
                    // your action here
                    //Helper.toast(LoginActivity.this, "Toggle visibility");
                    if (VISIBLE_PASSWORD) {
                        VISIBLE_PASSWORD = false;
                        loginPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                        loginPassword.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_outline_black_24dp, 0, R.drawable.ic_visibility_off_black_24dp, 0);
                    } else {
                        VISIBLE_PASSWORD = true;
                        loginPassword.setInputType(InputType.TYPE_CLASS_TEXT);
                        loginPassword.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_outline_black_24dp, 0, R.drawable.ic_visibility_black_24dp, 0);
                    }
                    return false;
                }
            }
            return false;
        }
    });

1

Theo nguồn này , nếu bạn đã di chuyển dự án của mình sang AndroidX, thì bạn có thể thay thế

compile "com.android.support:design:24.2.0"

với

implementation "com.google.android.material:material:1.0.0"

Sau đó, tất cả những gì bạn phải làm là đặt mã dưới đây vào tệp bố cục của bạn:

<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:passwordToggleEnabled="true"
    android:hint="@string/hint_text">

  <com.google.android.material.textfield.TextInputEditText
      android:layout_width="match_parent"
      android:layout_height="wrap_content"/>

</com.google.android.material.textfield.TextInputLayout>

Thông tin thêm về vật liệu TextInputLayoutcó thể được tìm thấy ở đây .

Đối với nguồn này , bạn nên chuyển sang AndroidX từ Thư viện hỗ trợ Android:

AndroidX là dự án nguồn mở mà nhóm Android sử dụng để phát triển, thử nghiệm, gói, phiên bản và thư viện phát hành trong Jetpack.

AndroidX là một cải tiến lớn đối với Thư viện hỗ trợ Android gốc. Giống như Thư viện hỗ trợ, AndroidX phân phối riêng với HĐH Android và cung cấp khả năng tương thích ngược trên các bản phát hành Android. AndroidX thay thế hoàn toàn Thư viện hỗ trợ bằng cách cung cấp tính năng tương đương và các thư viện mới. Ngoài ra, AndroidX bao gồm các tính năng sau:

Tất cả các gói trong AndroidX sống trong một không gian tên nhất quán bắt đầu bằng chuỗi androidx. Các gói Thư viện hỗ trợ đã được ánh xạ vào các gói androidx. * Tương ứng. Để có bản đồ đầy đủ của tất cả các lớp cũ và xây dựng các tạo phẩm cho các lớp mới, hãy xem trang Tái cấu trúc gói.

Không giống như Thư viện hỗ trợ, các gói AndroidX được duy trì và cập nhật riêng. Các gói androidx sử dụng Phiên bản ngữ nghĩa nghiêm ngặt bắt đầu với phiên bản 1.0.0. Bạn có thể cập nhật thư viện AndroidX trong dự án của mình một cách độc lập.

Tất cả sự phát triển Thư viện hỗ trợ mới sẽ diễn ra trong thư viện AndroidX. Điều này bao gồm bảo trì các tạo phẩm của Thư viện hỗ trợ ban đầu và giới thiệu các thành phần Jetpack mới.


1

Đầu tiên, đây là màn hình được hiển thị với khả năng hiển thị nội dung vectơ hình ảnh nhập mô tả hình ảnh ở đây

khi nhấp vào nó sẽ thay đổi thành hình ảnh hiển thị tắt nhập mô tả hình ảnh ở đây

mã cho chuyển đổi mật khẩu ở trên (mã xml)

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/laypass"
    android:layout_width="330dp"
    android:layout_height="50dp"
    android:layout_marginTop="24dp"
    app:layout_constraintEnd_toEndOf="@+id/editText3"
    app:layout_constraintStart_toStartOf="@+id/editText3"
    app:layout_constraintTop_toBottomOf="@+id/editText3">

    <EditText
        android:id="@+id/edit_password"
        style="@style/EditTextTheme"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/round"
        android:drawableLeft="@drawable/ic_password"
        android:drawablePadding="10dp"
        android:ems="10"
        android:hint="Password"
        android:inputType="textPassword"
        android:paddingLeft="10dp"
        android:paddingRight="15dp"
        android:textColor="@color/cyan92a6"
        android:textColorHint="@color/cyan92a6"
        android:textCursorDrawable="@null"
        android:textSize="18sp"
        />

    <ImageView
        android:id="@+id/show_pass_btn"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="8dp"
        android:alpha=".5"
        android:onClick="ShowHidePass"
        android:padding="5dp"
        android:src="@drawable/ic_visibility"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@+id/laypass"
        app:layout_constraintTop_toTopOf="@+id/edit_password" /> 
 </androidx.constraintlayout.widget.ConstraintLayout>

Mã Java cho hoạt động nút

public void ShowHidePass(View view) {

    if(view.getId()==R.id.show_pass_btn){
        if(edit_password.getTransformationMethod().equals(PasswordTransformationMethod.getInstance())){
            ((ImageView)(view)).setImageResource(R.drawable.ic_visibility_off);
            //Show Password
            edit_password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        }
        else{
            ((ImageView)(view)).setImageResource(R.drawable.ic_visibility);
            //Hide Password
            edit_password.setTransformationMethod(PasswordTransformationMethod.getInstance());
        }
    }
}

0

Trong XML làm như thế này

    <LinearLayout
          android:layout_height="wrap_content"
          android:layout_width="fill_parent"
          android:orientation="vertical"
          >
          <RelativeLayout
              android:id="@+id/REFReLayTellFriend"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal"
              >
          <EditText
              android:id="@+id/etpass1"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:background="@android:color/transparent"
              android:bottomLeftRadius="10dp"
              android:bottomRightRadius="50dp"
              android:fontFamily="@font/frutiger"
              android:gravity="start"
              android:inputType="textPassword"
              android:hint="@string/regpass_pass1"
              android:padding="20dp"
              android:paddingBottom="10dp"
              android:textColor="#000000"
              android:textColorHint="#d3d3d3"
              android:textSize="14sp"
              android:topLeftRadius="10dp"
              android:topRightRadius="10dp"/>
              <ImageButton
                  android:id="@+id/imgshowhide1"
                  android:layout_width="40dp"
                  android:layout_height="20dp"
                  android:layout_marginTop="20dp"
                  android:layout_marginRight="10dp"
                  android:background="@drawable/showpass"
                  android:layout_alignRight="@+id/etpass1"/>
          </RelativeLayout>    

 boolean show=true;
 //on image click inside password do this
 if(show){
                imgshowhide2.setBackgroundResource(0);
                imgshowhide2.setBackgroundResource(R.drawable.hide);
                etpass2.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                etpass2.setSelection(etpass2.getText().length());

                show=false;
            }else{
                imgshowhide2.setBackgroundResource(0);
                imgshowhide2.setBackgroundResource(R.drawable.showpass);
                //etpass1.setInputType(InputType.TYPE_TEXT);
                etpass2.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_PASSWORD);
                etpass2.setSelection(etpass2.getText().length());
                show=true;
            }

0

Phần mở rộng Kotlin của tôi. viết một lần sử dụng ở mọi nơi

fun EditText.tooglePassWord() {
this.tag = !((this.tag ?: false) as Boolean)
this.inputType = if (this.tag as Boolean)
    InputType.TYPE_TEXT_VARIATION_PASSWORD
else
    (InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD)

this.setSelection(this.length()) }

Bạn có thể giữ phương thức này trong bất kỳ tệp nào và sử dụng nó ở mọi nơi sử dụng nó như thế này

ivShowPassword.click { etPassword.tooglePassWord() }

Trong đó ivShowPassword được nhấp vào hình ảnh (eye) và etPassword là Editext


0

Một giải pháp tốt. Thiết lập một nút, sau đó sử dụng mã này:

public void showPassword(View v)
{

    TextView showHideBtnText = (TextView) findViewById(R.id.textView1);

    if(showHideBtnText.getText().toString().equals("Show Password")){
        password.setTransformationMethod(null);
        showHideBtnText.setText("Hide");
    } else{
        password.setTransformationMethod(new PasswordTransformationMethod());
        showHideBtnText.setText("Show Password");
    }


}

0

Thêm phương thức này:

fun EditText.revertTransformation() {
    transformationMethod = when(transformationMethod) {
        is PasswordTransformationMethod -> SingleLineTransformationMethod.getInstance()
        else -> PasswordTransformationMethod.getInstance()
    }
}

Gọi nó sẽ chuyển giữa trạng thái loại đầu vào (bạn có thể thay đổi chuyển đổi Đơn dòng thành yêu thích của bạn). Ví dụ sử dụng:

editText.revertTransformation()

0
1> Make a selector file "show_password_selector.xml".

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/pwd_hide"
        android:state_selected="true"/>
    <item android:drawable="@drawable/pwd_show"
        android:state_selected="false" />
</selector>

2>set "show_password_selector" file into imageview.

<ImageView
                        android:id="@+id/iv_pwd"
                        android:layout_width="@dimen/_35sdp"
                        android:layout_height="@dimen/_25sdp"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:layout_marginRight="@dimen/_15sdp"
                        android:src="@drawable/show_password_selector" />

3> put below code in java file.
  iv_new_pwd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (iv_new_pwd.isSelected()) {
                iv_new_pwd.setSelected(false);
                Log.d("mytag", "in case 1");
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT);
            } else {
                Log.d("mytag", "in case 1");
                iv_new_pwd.setSelected(true);
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            }
        }
    });

0
1> Make a selector file "show_password_selector.xml".

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/pwd_hide"
        android:state_selected="true"/>
    <item android:drawable="@drawable/pwd_show"
        android:state_selected="false" />
</selector>

2>set "show_password_selector" file into imageview.

<ImageView
                        android:id="@+id/iv_pwd"
                        android:layout_width="@dimen/_35sdp"
                        android:layout_height="@dimen/_25sdp"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:layout_marginRight="@dimen/_15sdp"
                        android:src="@drawable/show_password_selector" />

3> put below code in java file.
  iv_new_pwd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (iv_new_pwd.isSelected()) {
                iv_new_pwd.setSelected(false);
                Log.d("mytag", "in case 1");
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT);
            } else {
                Log.d("mytag", "in case 1");
                iv_new_pwd.setSelected(true);
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            }
        }
    });

-2
if (inputPassword.getTransformationMethod() == PasswordTransformationMethod.getInstance()) {
 //password is visible
                inputPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
            }
else if(inputPassword.getTransformationMethod() == HideReturnsTransformationMethod.getInstance()) {
 //password is hidden
                inputPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
            }
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.