Como alternar entre ocultar e exibir senha

176

Existe uma maneira inteligente de permitir que o usuário alterne entre ocultar e visualizar a senha em um EditText do Android? Vários aplicativos baseados em PC permitem que o usuário faça isso.

jacknad
fonte

Respostas:

155

Você pode alterar dinamicamente os atributos de um TextView. Se você definir o Atributo XML android:passwordpara true, a exibição mostrará pontos se você configurá-lo como false, o texto será mostrado.

Com o método setTransformationMethod, você poderá alterar esses atributos do código. (Isenção de responsabilidade: não testei se o método ainda funciona após a exibição da exibição. Se você tiver problemas com isso, deixe-me um comentário para que eu saiba.)

O código de amostra completo seria

yourTextView.setTransformationMethod(new PasswordTransformationMethod());

para ocultar a senha. Para mostrar a senha, você pode definir um dos métodos de transformação existentes ou implementar um TransformationMethod vazio que não faça nada com o texto de entrada.

yourTextView.setTransformationMethod(new DoNothingTransformation());
Janusz
fonte
61
Para mostrar a senha, você não precisa criar novas classes. Basta ligar setTransformationMethod(null).
Matt Quigley
4
@ Janusz, o uso do seguinte fornecerá a solução gud. setTransformationMethod (PasswordTransformationMethod.getInstance ()); e setTransformationMethod (HideReturnsTransformationMethod.getInstance ());
precisa saber é o seguinte
@ Janusz, mas como obter as teclas de mostrar / ocultar no teclado?
Narendra Singh
ao chamar setTransformationMethod em um EditeText, o retorno de chamada onTextChanged do EditText está sendo chamado ... é possível que isso não ocorra?
tsiro 02/02
1
Corrigir. O "setTransformationMethod () é a chave. Tudo o que você precisa é mudar de ouvinte: etPassword.setTransformationMethod (null) / etPassword.setTransformationMethod (new PasswordTransformationMethod ()). Por padrão, defina no seu xml EditView o android: inputType =" textPassword ""
Sergio
303

É realmente fácil de obter desde a Biblioteca de suporte v24.2.0.

O que você precisa fazer é apenas:

  1. Adicione a biblioteca de design às suas dependências

    dependencies {
         compile "com.android.support:design:24.2.0"
    }
  2. Use TextInputEditTextem conjunto comTextInputLayout

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

O passwordToggleEnabledatributo fará o trabalho!

  1. No seu layout raiz, não se esqueça de adicionar xmlns:app="http://schemas.android.com/apk/res-auto"

  2. Você pode personalizar sua alternância de senha usando:

app:passwordToggleDrawable- Drawable para usar como ícone de alternância da visibilidade da entrada de senha.
app:passwordToggleTint- Ícone a ser usado para alternar a visibilidade da entrada de senha.
app:passwordToggleTintMode- Modo de mesclagem usado para aplicar a tonalidade de fundo.

Mais detalhes na documentação do TextInputLayout .

insira a descrição da imagem aqui

Para AndroidX

  • Substitua android.support.design.widget.TextInputLayoutporcom.google.android.material.textfield.TextInputLayout

  • Substitua android.support.design.widget.TextInputEditTextporcom.google.android.material.textfield.TextInputEditText

mmBs
fonte
Na versão 25.1.0 Eu tenho um comportamento estranho: ele mostra a senha de alternância uma vez, mas se você pressioná-lo, ele vai desaparecer o_O'
MiguelHincapieC
1
Sim, também existem algumas peculiaridades com o android:textatributo ativado TextInputEditText. Você sempre pode levantar um problema no Google Issues Tracker para Android
mmBs 03/01
1
@ Delta7 Existem algumas maneiras e soluções alternativas. Por favor, faça a pergunta no SO, cole um link aqui e tentarei ajudá-lo.
precisa saber é
1
Obrigado. No entanto, na minha compilação, os gráficos de mostrar / ocultar são estranhamente revertidos da sua captura de tela - mostra os olhos riscados quando a senha está oculta - acho que alguém decidiu que os botões devem mostrar o estado atual em vez da ação (ou estado da meta).
Josh Sutterfield
1
@JoshSutterfield concorda. portanto, se quisermos o botão de ação, precisamos revertê-lo manualmente usando app:passwordToggleDrawable(descontinuado) ou app:endIconDrawableentão usar o drawable personalizado, como <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> acho que o Google deve corrigir esse comportamento. Boa discussão
Rahmat Ihsan
112

Para mostrar os pontos em vez da senha, defina o PasswordTransformationMethod:

yourEditText.setTransformationMethod(new PasswordTransformationMethod());

é claro que você pode definir isso por padrão no seu elemento edittext no layout xml com

android:password

Para mostrar novamente a senha legível, basta passar nulo como método de transformação:

yourEditText.setTransformationMethod(null);
Qlimax
fonte
7
android:passwordestá obsoleto agora e você deve usá-lo android:inputType.
20911 Wilka
54
Você também pode deixar seus usuários satisfeitos salvando a posição do cursor antes de definir o método de transformação e restaurá-lo depois. Use editText.getSelectionStart()e editText.getSelectionEnd()para salvar a posição do cursor e editText.setSelection(start, end)restaurá-la.
Mostafa
2
@Wilka: android: inputType NÃO permite alternar entre os dois estados em tempo de execução. Ele permite que você alterne apenas uma vez e, depois de alterá-lo, não será possível alterá-lo novamente. E não, o setTransformationMethod NÃO está obsoleto.
AndroidDev
@ Qlimax, mas como obter as teclas de mostrar / ocultar no teclado?
Narendra Singh
@DroidWormNarendra você normalmente anexa um ouvinte de evento a uma "imagem ocular" entre a entrada da senha ou dentro dela, como explicado aqui: stackoverflow.com/questions/3554377/… . Nesse ouvinte de eventos, você pode mostrar / ocultar a senha. AFAIK não é possível ter algumas chaves mostrar / esconder no teclado
Qlimax
82

Mostrar:

editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Esconder:

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

Após cada uma dessas opções, o cursor é redefinido, portanto:

editText.setSelection(editText.length());
Matt Logan
fonte
Testado no Android 4.3 e 5.0, funciona muito bem! Os documentos fazem com que pareça que isso funcione até a API 3.
James
@MattLogan, mas como obter as teclas de mostrar / ocultar no teclado?
Narendra Singh
5
Esta é a resposta mais direta aqui. Obrigado. (estranho não é a única aceita)
Tina
Isso não parece funcionar quando alterado em tempo de execução. Também não restaurará a última posição / seleção do cursor do usuário, se não estiver no final da linha.
Tom
31

Você pode usar app:passwordToggleEnabled="true"

aqui está um exemplo dado abaixo

<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">
Tabish khan
fonte
Hoje, deve ser preferível usar a resposta
Ruslan Berozov 18/04/19
Isso aumenta a altura da vista no meu caso. Existe alguma maneira de remover o preenchimento da gaveta de gaveta.
Sadda Hussain
Isso foi preterido nos componentes do material. Use app:endIconMode="password_toggle".
Nicolas
13

Use a caixa de seleção e altere o tipo de entrada de acordo.

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);
    }
}
Praveena
fonte
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;
}
Vladyslav Ulianytskyi
fonte
Não é necessário definir o texto novamente, apenas chame firstEditText.invalidate ();
Gunavant Patel 12/02/19
7

É um trabalho para mim. Isso o ajudará definitivamente

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

            }
        });
sujith s
fonte
5

Eu sinto que quero responder a essa pergunta, mesmo que haja boas respostas,

de acordo com a documentação TransformationMethod fazer a nossa missão

TransformationMethod

O TextView usa TransformationMethods para fazer coisas como substituir os caracteres das senhas por pontos ou impedir que os caracteres da nova linha causem quebras de linha nos campos de texto de linha única.

Observe que eu uso faca de manteiga, mas é o mesmo se o usuário verificar mostrar a senha

@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());
    }
Mina Fawzy
fonte
5

Eu posso adicionar o código ShowPassword / HidePassword com apenas algumas linhas, independentes em um bloco:

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"
            }
        }
    } );
    ...
david m lee
fonte
5

Eu tive o mesmo problema e é muito fácil de implementar.

Tudo o que você precisa fazer é agrupar seu campo EditText em um (com.google.android.material.textfield.TextInputLayout) e nessa adição (app: passwordToggleEnabled = "true").

Isso mostrará o olho no campo EditText e, quando você clicar nele, a senha aparecerá e desaparecerá quando clicar novamente.

<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>
Morne
fonte
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());

        }
    });
}
Shailesh Bhardwaj
fonte
4

De uma forma muito simples:

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

Espero que ajude.

Hiren Patel
fonte
3

Você pode MOSTRAR / ocultar a senha usando este código abaixo:

CÓDIGO 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" />

CÓDIGO 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());
        }
    }
});
Nikunjkumar Kapupara
fonte
3

Tente o seguinte:

Primeiro defina uma bandeira como global assim:

private boolean isShowPassword = false;

E defina o ouvinte para lidar com o toque no botão mostrar e ocultar a senha:

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;
                }
            }
        });
reza_khalafi
fonte
2

Experimente o projeto https://github.com/maksim88/PasswordEditText no github. Você nem precisa alterar seu código Java usando-o. Apenas mude

Editar texto

marcar para

com.maksim88.passwordedittext.PasswordEditText

no seu arquivo XML.

Anatoliy Shuba
fonte
Você tem alguma idéia de como usar setError com este componente, uma vez que o erro é sinalizado o ícone Show / Hide tornar invisível
guisantogui
2

mostrar e ocultar a senha Edit_Text com a caixa de seleção

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>

código 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
Amin
fonte
2

Você tentou com setTransformationMethod? Ele é herdado do TextView e deseja um TransformationMethod como parâmetro.

Você pode encontrar mais informações sobre o TransformationMethods aqui .

Ele também possui alguns recursos interessantes, como a substituição de caracteres.

Hamcha
fonte
2
O link da resposta está morto - "Código do status: 404 não encontrado" .
Pang
developer.android.com/reference/android/text/method/… pode ser um URL melhor para obter informações sobre os métodos de transformação do Android.
Mr.Drew 16/04
1

O que eu fiz foi

  1. Crie uma exibição de texto de edição e uma exibição de texto normal
  2. Faça com que eles se sobreponham usando o layout de restrição (assim como a tela de login do aplicativo do Facebook)
  3. Anexe um onClickListener à visualização de texto normal para alterar o tipo de entrada da visualização de edição de texto de acordo (Visível / Não visível)

Você pode conferir este vídeo para obter etapas e explicações mais detalhadas https://youtu.be/md3eVaRzdIM

Espero que ajude :)

Jack Tiong
fonte
1

Aqui está minha solução sem usar o método TextInputEditText e Transformação.

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>

Código 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;
        }
    });
Sagar Chapagain
fonte
1

De acordo com esta fonte , se você migrou seu projeto para o AndroidX, poderá substituir

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

com

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

Então, basta colocar o código abaixo no seu arquivo de layout:

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

Mais informações sobre o material TextInputLayoutpodem ser encontradas aqui .

Para esta fonte , é recomendável migrar para o AndroidX da Biblioteca de suporte do Android:

AndroidX é o projeto de código aberto que a equipe do Android usa para desenvolver, testar, empacotar, versão e liberar bibliotecas no Jetpack.

O AndroidX é uma grande melhoria para a Biblioteca de Suporte Android original. Como a Biblioteca de suporte, o AndroidX é enviado separadamente do sistema operacional Android e oferece compatibilidade com versões anteriores nas versões do Android. O AndroidX substitui completamente a Biblioteca de suporte, fornecendo paridade de recursos e novas bibliotecas. Além disso, o AndroidX inclui os seguintes recursos:

Todos os pacotes no AndroidX vivem em um espaço para nome consistente, começando com a cadeia androidx. Os pacotes da Biblioteca de suporte foram mapeados nos pacotes androidx. * Correspondentes. Para um mapeamento completo de todas as classes antigas e criar artefatos para as novas, consulte a página Refatoração de Pacotes.

Ao contrário da Biblioteca de suporte, os pacotes AndroidX são mantidos e atualizados separadamente. Os pacotes androidx usam versionamento semântico rigoroso, começando na versão 1.0.0. Você pode atualizar as bibliotecas do AndroidX em seu projeto de forma independente.

Todo o novo desenvolvimento da Biblioteca de suporte ocorrerá na biblioteca AndroidX. Isso inclui a manutenção dos artefatos originais da Biblioteca de Suporte e a introdução de novos componentes do Jetpack.

Amiraslan
fonte
1

No início, esta é a tela carregada com uma visibilidade de ativo de vetor de imagem insira a descrição da imagem aqui

ao clicar, ele mudará para a visibilidade da imagem desativada insira a descrição da imagem aqui

código para a troca de senha acima (código 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>

Código Java para operação do botão

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

Em XML faça assim

    <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;
            }
Syed Danish Haider
fonte
0

Minha extensão Kotlin. escrever uma vez usar em qualquer lugar

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

Você pode manter esse método em qualquer arquivo e usá-lo em qualquer lugar, usá-lo desta maneira

ivShowPassword.click { etPassword.tooglePassWord() }

em que ivShowPassword é clicado em imageview (eye) e etPassword é Editext

Aklesh Singh
fonte
0

Uma boa solução Configure um botão e use este código:

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


}
matthewoak
fonte
0

Adicione este método:

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

A chamada alternará entre o estado do tipo de entrada (você pode alterar a transformação de Linha Única para o seu favorito). Exemplo de uso:

editText.revertTransformation()
Benny
fonte
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);
            }
        }
    });
MEGHA DOBARIYA
fonte
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);
            }
        }
    });
MEGHA DOBARIYA
fonte
-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());
            }
Ankit Tomer
fonte