EditText giriş tipini programlı olarak ŞİFRE yerine NORMAL olarak değiştirin veya tersini yapın


191

Uygulamamda, EditTextvarsayılan girdi türü android:inputType="textPassword"deault tarafından ayarlanan bir var. Bu bir var CheckBoxkontrol edilir onun sağında, bu EditText NORMAL OVASI için TEXT giriş tipini değiştirir. Bunun kodu

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Benim sorunum, bu CheckBox işaretlenmediğinde tekrar giriş türü ŞİFRE olarak ayarlanmasıdır. Bunu kullanarak yaptım-

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

Ancak, bu düzenleme metninin içindeki metin hala görülebilir. Ve sürpriz için, yönlendirmeyi değiştirdiğimde, giriş türünü otomatik olarak ŞİFRE olarak ayarlar ve içindeki metin madde işaretlidir (şifre gibi gösterilir).

Bunu başarmanın bir yolu var mı?


Metin düzenleme için e-posta türü nasıl ayarlanır mailEdt.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS); işe yaramaz gibi görünüyor.
Mahendran

5
Kullanın mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);. Benim için çalışıyor.
Rajkiran

Yanıtlar:


347

Sadece aynı sorunu yaşayan insanlar için. Bu EditText'e programlı olarak ekstra bir özellik eklemeniz yeterlidir.

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

Sayısal parola için (pin).

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

Ayrıca, imlecin EditText'teki metnin sonunda olduğundan emin olun. Çünkü giriş türünü değiştirdiğinizde imleç otomatik olarak başlangıç ​​noktasına ayarlanır. Bu yüzden aşağıdaki kodu kullanmanızı öneririz:

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

Veri Bağlama'yı kullanırken, aşağıdaki kodu kullanabilirsiniz

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

Kotlin kullanıyorsanız,

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

2
Doğru cevap için belirtildiği gibi - seçimi değiştirmek yerine kullanabilirsinizInputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
mente

17
Neden dünyada android imleci hareket ettirmeyi seçtiğini anlamıyorum, sadece geliştiricilerin hayatını çok daha zorlaştırıyor.
Rafael Sanches


2
Kullanıcı şifre alanının ortasını düzenliyorsa, bu imleci sürekli olarak sonuna koyacaktır. Bu sorunu önlemek için editText.getSelectionStart()ve editText.getSelectionEnd()ile kullanmanızı tavsiye ederim setSelection(start, end).
JM Lord

1
İnsanlar daha aşağıya bakmamalı. Bu en iyi cevaptır ve @ JM Lord'un önerdiği değişikliği yapmanızı öneririm.
Mark

56

şifreyi metne değiştirmek veya tam tersi için bu kodu kullanın

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

tam örnek kod için http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty adresine bakın


6
HideReturnsTransformationMethod.getInstance () şifre gösterdi ve PasswordTransformationMethod.getInstance () şifre gizle ... uygulama doğru ancak yorumlar tersine döndü
Ahmed Adel Ismail

2
Bu en iyi yanıttır, tamamlamak için imleci son karakterle şu yere taşıyın: txtpassword.setSelection (txtpassword.getText (). Length ());
Josh

Bir an için EL-conte De-monte TereBentikh'in vurguladığı nokta nedeniyle çalışmıyor gibi görünüyor. Josh önerisi de faydalıdır. Bu en iyi cevap.
Ajay

Basit ve en iyi thnks
Sam

1
Sen profesörsün dostum! Bu çözümle Parola moduna (güvenli metin) geri döndükten sonra yazı tipi ile ilgili sorunlarla karşılaşmazsınız.
Tzegenos

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

Yukarıdaki yöntem benim için gerçekten işe yaramadı. Aşağıdaki cevap 2.2 sdk için çalışıyor.

password.setTransformationMethod (PasswordTransformationMethod.getInstance ());

EditText için inputType ayarlansın mı?


12

Tek bir InputType ataması nedeniyle yalnızca eşitlik operatörüne ihtiyacımız var: ImageView özelliğini daha az kodla değiştirmek için bir başka basit örnek :

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

Değiştiriliyor:

InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

İle :

InputType.TYPE_CLASS_TEXT

Aynı sonucu verecek ama daha kısa bir kelime.


12
Checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

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

6

Bu benim için çalıştı:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

Lütfen önce soruyu okuyun. Şifre alanı ve metin alanı arasında geçiş yapmak istiyorum. Bu bana sayısal metin alanı verecektir.
Rajkiran

6

Tamam Yani saatlerce denedikten sonra nihayet uyguladı. Kod aşağıdadır ..

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

    }
});

Açıklama: - Gösterildiği gibi varsayılan metin ile bir düğme var. Onclick olayından sonra düğmenin metninin gösterilip gösterilmediğini kontrol edin. Gösteriliyorsa, giriş türünü değiştirin, imleç konumunu ayarlayın ve yeni metni içinde sakla olarak ayarlayın.

Gizlendiğinde ... ters yapmak yani şifreyi gizlemek, imleci ayarlamak ve metni gösteri olarak ayarlamak. Ve bu kadar. Bir cazibe gibi çalışıyor.


6

Kotlin kullanıcıları için:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

Ve bu sadece şifre sembollerini gizleyecek mi?
CoolMind

5

Şifreyi metne veya tam tersine değiştirmek için bu kodu kullanın. Bu kod benim için mükemmeldi. Bunu dene..

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

}
});

Kabul edilen cevaptan farkı nedir? Spam göndermeden önce lütfen soruyu ve yanıtı dikkatle okuyun.
Rajkiran

3

Bu, Görüntü / Düğmenin parolayı göstermesi / gizlemesi için tam onClick işleyicisidir.

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

İçin teşekkürler edtPassword.getSelectionStart().
CoolMind

3

Şifre Görünürlük Geçiş özelliği düz gelen şifreyi geçiş sağlayan kitaplığı sürümü 24.2.0 desteklemek için eklenmiştir EditTextbir ihtiyaç olmadan CheckBox.

Önce 24.2.0 için destek kitaplığı sürümünü güncelleyerek ve daha sonra bir ayarlayarak temelde bu işi yapabilir inputTypeüzerindeki şifrenin TextInputEditText. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

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

TextInputLayout için geliştirici belgelerinde yeni özellik hakkında daha fazla bilgi alabilirsiniz .


3

Destek Kitaplığı'ndan beri v24.2.0. bunu çok kolay yapabilirsin

Yapmanız gereken sadece:

  1. Tasarım kitaplığını bağımlılıklarınıza ekleyin

    dependencies {
         compile "com.android.support:design:25.1.0"
    }
  2. TextInputEditTextİle birlikte kullanınTextInputLayout

    <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 özniteliği, şifre geçişinin görünmesini sağlar

  1. Kök düzeninizde eklemeyi unutmayın xmlns:app="http://schemas.android.com/apk/res-auto"

  2. Aşağıdakileri kullanarak şifre geçişinizi özelleştirebilirsiniz:

app:passwordToggleDrawable- Şifre girişi görünürlük değiştirme simgesi olarak kullanmak için çizilebilir.
app:passwordToggleTint- Şifre giriş görünürlüğü geçişi için kullanılacak simge.
app:passwordToggleTintMode- Arka plan tonunu uygulamak için kullanılan karıştırma modu.

Daha fazla bilgi TextInputLayout belgelerinde . resim açıklamasını buraya girin


2

Visual Studio / Xamarin için benzer bir çözüm arayışım beni bu konuya yönlendiriyor. Xamarin ile benim için işe yarayan şey aşağıda. Bu uygulamanın TYPE_TEXT_FLAG_NO_SUGGESTIONSmodlar arasında geçiş yaparken bayrağı koruduğunu unutmayın .

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

Karakterleri göstermek için: et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;

Karakterleri gizlemek için: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;

Konumu bitirmek için: int position = et.Text.Length; et.SetSelection(position, position);


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 ); }Visual Studio / Xamarin için bu kod nasıl kullanılır ..?
sunil y

i nasıl () koşulunda edittext girdi türü almak demek ..?
sunil y

2

bazı dinamik durumlar holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);o kadar iyi çalışmayacak

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

Not: Bu, arrayaapter kullanmak gibi dinamik kontrolleri kullanırken uygundur


2

setInputTypeBir şifre alanı için sonra , FONT ile ilgili sorun olacak
İşte benim yazı tipi sorunu olmadan şifre göstermek / gizlemek için benim çözüm

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

Not: Klavyenin hem metin hem de sayı görüntülemesini istediğim için veya InputType.TYPE_TEXT_VARIATION_PASSWORDyerine kullanıyorumInputType.TYPE_CLASS_TEXTHideReturnsTransformationMethod

DEMO


1

android:inputType="textPassword"Düzeninizden kaldıracağım . Bu yüzden yön değiştiğinde parolaya geri dönüyor. Çünkü yönlendirme her değiştiğinde görünüm yeniden oluşturuluyor.

İlk sorun için şunu deneyin:

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

temel olarak giriş türünü değiştirmeden önce metni boşaltın ve sonra tekrar ekleyin.


Çalışmıyor. password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);Başlatma işleminden hemen sonra bile koymayı denedim , ama ne yazık ki!
Rajkiran

1

Şifre düzenleme metninde Şifre görünürlüğünü uygulamak istediğinizde kodu tamamlayın.

Tutamaç oluşturma [Herhangi bir çekilebilir veya Onay Kutusu]

tıkla veya İşaretli / İşaretini kaldır üzerine şunu yaz:

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

Bu satırı yazmayı unutmayın:

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

İmleci satır sonuna kadar sıfırlar.


@PKR, bu durumda kullanıma hazır olan uygulama arkadaşınızı kontrol edin! :)
sud007

@ sud007 u nasıl Xamarin / visual Studio if koşul yazmak için herhangi bir fikrin var mı?
sunil y

1

Giriş kutumdaki giriş türünü değiştiriyorum, bu yüzden OnCheckedChangeListeneryapıyorum:

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

Ve sonunda işe yaradı.

İle ilgili bir mantıksal sorun gibi görünüyor TYPE_TEXT_VARIATION_VISIBLE_PASSWORD. Bayrağı ters çevirin ve sorunu çözmelidir.

Senin durumunda:

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

1

Dönüşüm yöntemini kullanın:

Gizlemek için:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

Görünür:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

Bu kadar.


0

@Rajkiran tarafından sağlanan doğru cevaba sadece bir yorum daha eklemek isteyebilirsiniz

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

NORMAL giriş durumuna getirilir, böylece kullanıcılar klavyenin otomatik önerisi sizi rahatsız etmez


0

blockquote

nihai int [] sayım = {0};

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

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

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

        }
    });

0

Cevaplarından dayanarak shanky t ve Everton Fernandes Rosario I KOTLIN, yazdığı passwordmizanpajınızda bir EditText bir kimliğidir.

// 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)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.