Secara terprogram ubah jenis input dari EditText dari PASSWORD ke NORMAL & sebaliknya

191

Dalam aplikasi saya, saya memiliki EditTexttipe input default yang diatur android:inputType="textPassword"oleh deault. Memiliki CheckBoxhak di sebelah kanannya, yaitu ketika dicentang, mengubah tipe input EditText itu menjadi NORMAL PLAIN TEXT. Kode untuk itu

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Masalah saya adalah, ketika kotak centang itu tidak dicentang lagi harus mengatur jenis input ke PASSWORD. Saya sudah melakukannya dengan-

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

Tapi, teks di dalam edittext itu masih terlihat. Dan yang mengejutkan, ketika saya mengubah orienatation, secara otomatis mengatur tipe input ke PASSWORD dan teks di dalamnya diberi bullet (ditampilkan seperti kata sandi).

Adakah cara untuk mencapai ini?

Rajkiran
sumber
Cara mengatur jenis email untuk mengedit teks mailEdt.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS); sepertinya tidak berfungsi.
Mahendran
5
Gunakan mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);. Bekerja untukku.
Rajkiran

Jawaban:

347

Hanya untuk orang-orang yang mengalami masalah yang sama. Cukup tambahkan atribut tambahan ke EditText itu secara terprogram dan Anda selesai.

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

Untuk kata sandi angka (pin).

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

Juga, pastikan kursor berada di akhir teks dalam EditText. Karena, ketika Anda mengubah jenis input, kursor akan secara otomatis diatur ke titik awal. Jadi saya sarankan untuk menggunakan kode berikut:

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

Saat menggunakan Penjilidan Data, Anda dapat menggunakan kode berikut

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

Jika menggunakan Kotlin,

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
Rajkiran
sumber
2
seperti dicatat untuk jawaban yang benar - alih-alih mengubah pilihan yang dapat Anda gunakanInputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
mente
17
saya tidak mengerti mengapa di dunia android memilih untuk memindahkan kursor, itu hanya membuat hidup pengembang jauh lebih sulit.
Rafael Sanches
2
+1 untuk di sini adalah jawaban terbaik
nAkhmedov
2
Jika pengguna mengedit bagian tengah kolom kata sandi, ini akan selalu menempatkan kursor di bagian akhir. Saya akan merekomendasikan menggunakan editText.getSelectionStart()dan editText.getSelectionEnd()dengan setSelection(start, end)untuk menghindari masalah ini.
JM Lord
1
Orang-orang seharusnya tidak melihat lebih jauh ke bawah. Ini adalah jawaban terbaik dan menyarankan agar Anda membuat perubahan yang disarankan oleh @JM Lord.
Markus
56

gunakan kode ini untuk mengubah kata sandi menjadi teks dan sebaliknya

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

untuk kode contoh lengkap, rujuk http://www.codeproject.com/Tips/518641/Tampilkan-hid-pasword-in-a-edit-teks-view-pasword-ty

neeraj t
sumber
6
HideReturnsTransformationMethod.getInstance () menunjukkan kata sandi, dan PasswordTransformationMethod.getInstance () sembunyikan kata sandi ... implementasi benar tetapi komentarnya dibalik
Ahmed Adel Ismail
2
Ini adalah jawaban terbaik, untuk menyelesaikannya, cukup pindahkan kursor ke karakter terakhir dengan: txtpassword.setSelection (txtpassword.getText (). Length ());
Josh
Untuk sesaat sepertinya tidak berfungsi karena titik yang disorot oleh EL-conte De-monte TereBentikh. Saran Josh juga bermanfaat. Ini jawaban terbaik.
Ajay
Simple and best thnks
Sam
1
Anda adalah profesor teman saya! Dengan solusi ini Anda tidak menghadapi masalah dengan font setelah mengubah kembali ke mode Password (teks aman).
Tzegenos
16
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);

Metode di atas tidak berhasil untuk saya. Jawaban di bawah ini berfungsi untuk 2.2 sdk.

password.setTransformationMethod (PasswordTransformationMethod.getInstance ());

Tetapkan inputType untuk EditText?

ymutlu
sumber
12

Contoh sederhana lain menggunakan ImageView untuk mengaktifkan visibilitas dengan kode lebih sedikit, karena inputType tunggal menetapkan kita hanya perlu operator kesetaraan:

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

Mengganti:

InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

Dengan:

InputType.TYPE_CLASS_TEXT

Akan memberikan hasil yang sama tetapi kata yang lebih pendek.

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

Ini bekerja untuk saya:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
mav_baumer15
sumber
Silakan baca pertanyaannya terlebih dahulu. Saya ingin beralih antara bidang kata sandi dan bidang teks. Ini akan memberi saya bidang teks angka.
Rajkiran
6

Ok Jadi setelah berjam-jam berusaha akhirnya menerapkannya. Di bawah ini adalah kode ..

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

    }
});

Penjelasan: - Saya memiliki tombol dengan teks default sebagai show. Setelah acara onclick di atasnya memeriksa apakah teks tombol ditampilkan. Jika ditampilkan, maka ubah jenis input, sesuaikan posisi kursor dan atur teks baru sebagai sembunyikan di dalamnya.

Ketika itu disembunyikan ... melakukan kebalikan yaitu menyembunyikan kata sandi, menyesuaikan kursor dan mengatur teks sebagai acara. Dan itu saja. Ini bekerja seperti pesona.

Debasish Ghosh
sumber
6

Untuk pengguna kotlin:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
Elisabeth Whiteley
sumber
Dan ini hanya akan menyembunyikan simbol kata sandi?
CoolMind
5

Gunakan kode ini untuk mengubah kata sandi menjadi teks dan sebaliknya. Kode ini sangat cocok untuk saya. Coba ini..

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

}
});
Surya
sumber
Apa bedanya dengan jawaban yang diterima? Harap baca pertanyaan dan jawabannya dengan cermat sebelum mengirim spam.
Rajkiran
3

Ini adalah penangan onClick penuh untuk Gambar / Tombol untuk menampilkan / menyembunyikan kata sandi.

    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);
        }
    };
Everton Fernandes Rosario
sumber
Terima kasih untuk edtPassword.getSelectionStart().
CoolMind
3

Fitur Password Visibility Toggle telah ditambahkan untuk mendukung perpustakaan versi 24.2.0 memungkinkan Anda untuk mengganti kata sandi langsung dari yang EditTexttanpa perlu a CheckBox.

Anda dapat membuatnya bekerja pada dasarnya dengan terlebih dahulu memperbarui versi perpustakaan dukungan Anda ke 24.2.0 dan kemudian mengatur inputTypekata sandi di TextInputEditText. Berikut cara melakukannya:

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

Anda dapat memperoleh informasi lebih lanjut tentang fitur baru pada dokumentasi pengembang untuk TextInputLayout .

moyheen
sumber
3

Karena Perpustakaan Dukungan v24.2.0. Anda dapat mencapai ini dengan sangat mudah

Yang perlu Anda lakukan hanyalah:

  1. Tambahkan pustaka desain ke dependecies Anda

    dependencies {
         compile "com.android.support:design:25.1.0"
    }
  2. Gunakan TextInputEditTextbersama denganTextInputLayout

    <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 atribut akan membuat sakelar kata sandi muncul

  1. Di tata letak root Anda jangan lupa untuk menambahkan xmlns:app="http://schemas.android.com/apk/res-auto"

  2. Anda dapat menyesuaikan sakelar kata sandi dengan menggunakan:

app:passwordToggleDrawable- Dapat ditarik untuk digunakan sebagai ikon sakelar visibilitas input kata sandi.
app:passwordToggleTint- Ikon untuk digunakan untuk beralih visibilitas input kata sandi.
app:passwordToggleTintMode- Mode Blending digunakan untuk menerapkan warna latar belakang.

Lebih detail dalam dokumentasi TextInputLayout . masukkan deskripsi gambar di sini

Javier Vieira
sumber
2

Pencarian saya untuk solusi serupa untuk Visual Studio / Xamarin membawa saya ke utas ini. Di bawah ini yang berhasil bagi saya dengan Xamarin. Perhatikan bahwa implementasi ini mempertahankan TYPE_TEXT_FLAG_NO_SUGGESTIONSflag saat beralih antar mode.

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

Untuk menampilkan karakter: et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;

Untuk menyembunyikan karakter: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;

Untuk mengatur posisi ke ujung: int position = et.Text.Length; et.SetSelection(position, position);

Tony
sumber
bagaimana cara menggunakan kode ini 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 ); }untuk Visual Studio / Xamarin ..?
sunil y
maksud saya bagaimana mendapatkan inputtype dari edittext dalam kondisi if () ..?
sunil y
2

beberapa situasi dinamis holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);tidak akan berfungsi jadi lebih baik gunakan keduanya seperti itu

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

Catatan: ini cocok untuk saat Anda menggunakan kontrol dinamis seperti menggunakan arrayaapter

Issac Balaji
sumber
2

Setelah Anda setInputTypeuntuk bidang kata sandi, Anda akan memiliki masalah dengan FONT.
Ini adalah solusi saya untuk menampilkan / menyembunyikan kata sandi tanpa masalah font

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

Catatan: Saya menggunakan InputType.TYPE_TEXT_VARIATION_PASSWORDbukan InputType.TYPE_CLASS_TEXTatauHideReturnsTransformationMethod karena saya ingin keyboard menampilkan teks dan angka

DEMO

Phan Van Linh
sumber
1

Saya akan menghapus android:inputType="textPassword" dari tata letak Anda. Itu sebabnya ia beralih kembali ke kata sandi ketika orientasi berubah. Karena setiap kali orientasi mengubah tampilan sedang dibuat ulang.

Adapun masalah pertama coba ini:

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

pada dasarnya mengosongkan teks sebelum Anda mengubah jenis input dan kemudian menambahkannya kembali.

bytebender
sumber
Tidak bekerja Saya bahkan mencoba meletakkan password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);segera setelah inisialisasi, tetapi sayangnya!
Rajkiran
1

Kode lengkap saat Anda ingin menerapkan visibilitas kata sandi dalam teks edit kata sandi.

Buat pegangan [Drawable or Checkbox]

di klik atau di Centang / Hapus centang tulis ini:

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

Jangan lupa untuk menulis baris ini:

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

Ini mengatur ulang kursor ke akhir baris.

sud007
sumber
@PKR memeriksa teman implementasi, yang dalam hal ini siap digunakan! :)
sud007
@ sud007 apakah Anda tahu bagaimana menulis kondisi if di Xamarin / visual Studio ..?
sunil y
1

Saya mengubah jenis input pada kotak centang saya, jadi saya OnCheckedChangeListenerlakukan:

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

Dan akhirnya berhasil.

Sepertinya masalah boolean dengan TYPE_TEXT_VARIATION_VISIBLE_PASSWORD. Balikkan bendera dan itu harus memperbaiki masalah.

Dalam kasus Anda:

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
Gugadin
sumber
1

Gunakan metode Transformasi:

Menyembunyikan:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

Untuk Terlihat:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

Itu dia.

Benny
sumber
0

Hanya komentar tambahan tentang jawaban yang benar yang diberikan oleh @Rajkiran, Anda mungkin ingin menambahkan

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

ke status input NORMAL sehingga pengguna tidak akan terganggu oleh saran otomatis keyboard

ZJ Cong
sumber
0

Blokir

int akhir [] hitung = {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]--;
            }

        }
    });
gattamaneni venkatanarasimham
sumber
0

Berdasarkan jawaban neeraj t dan Everton Fernandes Rosario yang saya tulis di Kotlin, di mana passwordada id dari EditText di tata letak Anda.

// 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)
    }
}
CoolMind
sumber