Programowo zmień typ wprowadzania tekstu edycji z HASŁA na NORMALNY i odwrotnie


191

W mojej aplikacji mam EditTextdomyślny typ danych wejściowych domyślnie ustawiony na android:inputType="textPassword"deault. Ma CheckBoxpo swojej prawej stronie, która po zaznaczeniu zmienia typ wprowadzania tego EditText na NORMAL PLAIN TEXT. Kod na to jest

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Mój problem polega na tym, że gdy ta opcja jest odznaczona, powinna ponownie ustawić typ danych wejściowych na HASŁO. Zrobiłem to za pomocą-

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

Ale tekst wewnątrz tego edytowanego tekstu jest nadal widoczny. I ku zaskoczeniu, kiedy zmieniam orientację, automatycznie ustawia typ wprowadzania na HASŁO, a tekst w środku jest wypunktowany (pokazany jak hasło).

Jest jakiś sposób na osiągnięcie tego?


Jak ustawić typ e-maila do edycji tekstu mailEdt.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS); nie wydaje się działać.
Mahendran,

5
Zastosowanie mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);. Pracuje dla mnie.
Rajkiran,

Odpowiedzi:


346

Tylko dla ludzi, którzy mają ten sam problem. Po prostu dodaj dodatkowy atrybut do tego EditText programowo i gotowe.

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

W przypadku hasła numerycznego (pin).

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

Upewnij się również, że kursor znajduje się na końcu tekstu w EditText. Ponieważ po zmianie typu wprowadzania kursor zostanie automatycznie ustawiony na punkt początkowy. Proponuję więc użyć następującego kodu:

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

Korzystając z powiązania danych, możesz skorzystać z następującego kodu

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

Jeśli używasz Kotlin,

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

2
jak zaznaczono dla poprawnej odpowiedzi - zamiast zmieniać wybór, którego możesz użyćInputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
mente

17
nie rozumiem, dlaczego na świecie android wybiera ruch kursorem, to po prostu utrudnia życie programistom.
Rafael Sanches


2
Jeśli użytkownik edytuje środek pola hasła, kursor będzie stale umieszczany na końcu. Zalecam używanie editText.getSelectionStart()i editText.getSelectionEnd()przy pomocy, setSelection(start, end)aby uniknąć tego problemu.
JM Lord

1
Ludzie nie powinni nawet patrzeć w dół. To najlepsza odpowiedź i sugeruje dokonanie sugerowanej zmiany @JM Lorda.
Mark

56

użyj tego kodu, aby zmienić hasło na tekst i odwrotnie

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

pełny przykładowy kod znajduje się na stronie http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty


6
HideReturnsTransformationMethod.getInstance () pokazał hasło, a PasswordTransformationMethod.getInstance () ukryj hasło ... implementacja jest poprawna, ale komentarze są odwrócone
Ahmed Adel Ismail

2
Jest to najlepsza odpowiedź, aby ją ukończyć, wystarczy przesunąć kursor do ostatniego znaku za pomocą: txtpassword.setSelection (txtpassword.getText (). Length ());
Josh

Przez chwilę wydaje się, że nie działa z powodu punktu podkreślonego przez EL-conte De-monte TereBentikh. Pomocna jest także sugestia Josha. To najlepsza odpowiedź.
Ajay,

Proste i najlepsze podziękowania
Sam

1
Jesteś profesorem, przyjacielu! Dzięki temu rozwiązaniu nie występują problemy z czcionką po powrocie do trybu hasła (bezpieczny tekst).
Tzegenos

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

Powyższa metoda tak naprawdę nie działała dla mnie. Odpowiedź poniżej działa dla 2.2 SDK.

password.setTransformationMethod (PasswordTransformationMethod.getInstance ());

Ustawić inputType dla EditText?


12

Kolejny prosty przykład użycia ImageView do przełączania widoczności z mniejszym kodem, ponieważ z powodu pojedynczego przypisania InputType potrzebujemy tylko operatora równości:

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

Zastępowanie:

InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

Z :

InputType.TYPE_CLASS_TEXT

Daje ten sam wynik, ale krótsze słowo.


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

To działało dla mnie:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

Przeczytaj najpierw pytanie. Chcę przełączać między polem hasła a polem tekstowym. To da mi numeryczne pole tekstowe.
Rajkiran

6

Ok Więc po godzinach prób w końcu go wdrożyłem. Poniżej znajduje się kod ..

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

    }
});

Objaśnienia: - Mam przycisk z domyślnym tekstem jako show. Po zdarzeniu onclick na nim sprawdza, czy tekst przycisku jest wyświetlany. Jeśli jest pokazywany, to zmieniaj typ wprowadzania, dostosowując pozycję kursora i ustawiając nowy tekst jako ukryty w nim.

Gdy jest ukryty ... robi odwrotną czynność, tj. Ukrywa hasło, dostosowuje kursor i ustawia tekst jako pokaz. I to wszystko. Działa jak urok.


6

Dla użytkowników kotlin:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

A to ukryje tylko symbole haseł?
CoolMind,

5

Użyj tego kodu, aby zmienić hasło na tekst i odwrotnie. Ten kod doskonale dla mnie działał. Spróbuj tego..

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

}
});

Czym różni się od przyjętej odpowiedzi? Przeczytaj uważnie pytanie i odpowiedź przed spamowaniem.
Rajkiran

3

Jest to pełna procedura obsługi OnClick dla obrazu / przycisku do pokazywania / ukrywania hasła.

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

Dzięki za edtPassword.getSelectionStart().
CoolMind,

3

Dodano funkcję przełączania widoczności hasła w celu obsługi biblioteki w wersji 24.2.0, która umożliwia przełączanie hasła od razu EditTextbez potrzeby CheckBox.

Możesz sprawić, by działało to w zasadzie, najpierw aktualizując wersję biblioteki pomocy technicznej do 24.2.0, a następnie ustawiając inputTypehasło w TextInputEditText. Oto jak to zrobić:

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

Możesz uzyskać więcej informacji o nowej funkcji w dokumentacji dla programistów TextInputLayout .


3

Od czasu biblioteki wsparcia v24.2.0. możesz to osiągnąć bardzo łatwo

Musisz tylko:

  1. Dodaj bibliotekę projektów do swoich zależności

    dependencies {
         compile "com.android.support:design:25.1.0"
    }
  2. Używaj TextInputEditTextw połączeniu zTextInputLayout

    <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 Atrybut spowoduje zmianę hasła

  1. W swoim układzie głównym nie zapomnij dodać xmlns:app="http://schemas.android.com/apk/res-auto"

  2. Możesz dostosować przełączanie hasła, używając:

app:passwordToggleDrawable- Możliwość rysowania w celu użycia jako ikony przełączania widoczności hasła.
app:passwordToggleTint- Ikona używana do przełączania widoczności hasła.
app:passwordToggleTintMode- Tryb mieszania stosowany do nakładania odcienia tła.

Więcej szczegółów w dokumentacji TextInputLayout . wprowadź opis zdjęcia tutaj


2

Moje poszukiwania podobnego rozwiązania dla Visual Studio / Xamarin doprowadziły mnie do tego wątku. Poniżej znajduje się to, co działało dla mnie z Xamarin. Pamiętaj, że ta implementacja zachowuje TYPE_TEXT_FLAG_NO_SUGGESTIONSflagę podczas przełączania trybów.

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

Aby pokazać postacie: et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;

Aby ukryć postacie: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;

Aby ustawić pozycję do końca: int position = et.Text.Length; et.SetSelection(position, position);


jak korzystać z tego kodu 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 ); }dla Visual Studio / Xamarin ..?
sunil y

Mam na myśli, jak uzyskać typ wejściowy tekstu edycji w warunku if () ..?
sunil y

2

niektóre dynamiczne sytuacje holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);nie będą działać, więc lepiej użyj obu takich

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

Uwaga: jest to odpowiednie, gdy używasz dynamicznych kontrolek, takich jak arrayaapter


2

Po wpisaniu setInputTypehasła pojawi się problem z FONT
Oto moje rozwiązanie dla pokaż / ukryj hasło bez problemu z czcionkami

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

Uwaga: używam InputType.TYPE_TEXT_VARIATION_PASSWORDzamiast InputType.TYPE_CLASS_TEXTlub HideReturnsTransformationMethodponieważ chcę, aby klawiatura wyświetlała zarówno tekst, jak i cyfrę

PRÓBNY


1

Chciałbym usunąć android:inputType="textPassword"z twojego układu. Właśnie dlatego zmienia orientację na hasło, gdy zmienia się orientacja. Ponieważ za każdym razem, gdy zmienia się orientacja, widok jest odtwarzany.

Jeśli chodzi o pierwszy problem, spróbuj:

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

w zasadzie opróżnianie tekstu przed zmianą typu wprowadzania, a następnie dodawanie go z powrotem.


Nie działa. Próbowałem nawet umieścić password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);natychmiast po inicjalizacji, ale niestety!
Rajkiran

1

Uzupełnij kod, jeśli chcesz zastosować widoczność hasła w tekście edycji hasła.

Utwórz uchwyt [Dowolny rysunek lub pole wyboru]

po kliknięciu lub zaznaczeniu / Odznacz napisz:

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

Nie zapomnij napisać tej linii:

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

Resetuje kursor do końca linii.


@PKR sprawdź znajomego, który w tym przypadku jest gotowy do użycia! :)
sud007,

@ sud007 czy masz jakiś pomysł, jak napisać warunek if w Xamarin / visual Studio ..?
sunil y

1

Zmieniam typ danych wejściowych na moim polu wyboru, więc OnCheckedChangeListenerrobię:

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

I w końcu zadziałało.

Wygląda na problem boolowski TYPE_TEXT_VARIATION_VISIBLE_PASSWORD. Odwróć flagę i powinno to rozwiązać problem.

W Twoim przypadku:

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

1

Użyj metody transformacji:

Ukryć:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

Do widocznego:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

Otóż ​​to.


0

Tylko dodatkowy komentarz do poprawnej odpowiedzi udzielonej przez @Rajkiran, możesz chcieć dodać

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

do stanu wejściowego NORMAL, aby użytkownicy nie drażnili się autosugestią klawiatury


0

Zablokować cytat

final int [] count = {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

Na podstawie odpowiedzi neeraj t i Evertona Fernandesa Rosario napisałem w Kotlinie, gdzie passwordjest identyfikator EditText w twoim układzie.

// 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)
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.