Câu trả lời:
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:password
thà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());
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à:
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"
}
Sử dụng TextInputEditText
kế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 passwordToggleEnabled
thuộc tính sẽ làm công việc!
Trong bố cục gốc của bạn đừng quên thêm xmlns:app="http://schemas.android.com/apk/res-auto"
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 .
Dành cho AndroidX
Thay thế android.support.design.widget.TextInputLayout
bằngcom.google.android.material.textfield.TextInputLayout
Thay thế android.support.design.widget.TextInputEditText
bằngcom.google.android.material.textfield.TextInputEditText
android:text
thuộ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
app:passwordToggleDrawable
(không dùng nữa) hoặc app:endIconDrawable
sau đó 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
Để 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);
android:password
bây giờ không được dùng nữa và bạn nên sử dụng android:inputType
thay thế.
editText.getSelectionStart()
và editText.getSelectionEnd()
để lưu vị trí con trỏ và editText.setSelection(start, end)
khôi phục nó.
Để 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());
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">
app:endIconMode="password_toggle"
.
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);
}
}
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;
}
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());
}
}
});
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());
}
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"
}
}
} );
...
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>
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());
}
});
}
Ở 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.
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());
}
}
});
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;
}
}
});
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.
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
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.
Những gì tôi đã làm là
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 :)
Đâ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;
}
});
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 TextInputLayout
có 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.
Đầ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
khi nhấp vào nó sẽ thay đổi thành hình ảnh hiển thị tắt
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());
}
}
}
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;
}
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
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");
}
}
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()
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);
}
}
});
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);
}
}
});
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());
}
setTransformationMethod(null)
.