Definir inputType para um EditText programaticamente?

216

Como podemos definir o tipo de entrada para um EditText programaticamente? Estou tentando:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

parece não ter nenhum efeito.

user246114
fonte

Respostas:

213

De acordo com os documentos do TextView , a versão programática do android: password é setTransformationMethod () , não setInputType (). Então, algo como:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

deve fazer o truque.

patife
fonte
4
Apenas para adicionar isso, você precisa chamar setTransformationMethod em vez de setInputType. Chamar setInputType após setTransformationMethod faz com que o EditText não esteja no modo de senha novamente.
Paul Ryland
11
esta resposta está errada para a pergunta que está sendo feita. Isso transforma apenas o texto inserido no EditText(substitui caracteres por pontos de senha). Isso não tem nenhum efeito sobre o que é permitido entrar nele EditTextmesmo.
Slinden77
4
O setInputType finalmente chama setTransformationMethod de dentro, portanto, se você passar o TYPE_TEXT_VARIATION_PASSWORD para setInputType, ele fará isso por você. O problema parece estar chamando setSingleLine após chamar setInputType, que chamará setTransformationMethod com nulo ou com o transformador de linha única, limpando o transformador de senha.
sparkym3
após chamada setTransformationMethod (PasswordTransformationMethod.getInstance ()) Eu não posso capaz de editá-lo
sujith s
mas a senha será exibida no texto sugerido na próxima vez em que o campo for usado
Gary Davies
408

Para definir o tipo de entrada para um EditText programaticamente, é necessário especificar que o tipo de classe de entrada seja texto.

editPass.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
Amitku
fonte
2
Sua dica funcionou perfeitamente para mim! Eu tive um problema semelhante ao definir programaticamente o tipo de entrada como multilinha.
Anna Lam
Qual é o significado de ter um operador OR bit a bit aqui? Desculpe, eu sou novo no android.
precisa
Discordo de InputType.TYPE_TEXT_VARIATION_PASSWORD não funciona para mim, mas setTransformationMethod (PasswordTransformationMethod.getInstance ()); faz !
Lluis Felisart
37

Aqui estão os vários tipos de entrada, como mostrado no teclado padrão.

demonstração de tipos de entrada

Definindo o tipo de entrada programaticamente

editText.setInputType(InputType.TYPE_CLASS_TEXT);

Além disso, outras opções TYPE_CLASS_TEXTpodem ser encontradas na documentação .

Definindo o tipo de entrada em XML

<EditText
    android:inputType="text"
/>

Além disso, outras opções textpodem ser encontradas na documentação .

Código suplementar

Aqui está o código para a imagem acima.

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;
    List<InputTypeItem> inputTypes;
    int counter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);
        initArray();
    }

    public void onChangeInputTypeButtonClick(View view) {
        if (counter >= inputTypes.size()) {
            startOver();
            return;
        }
        textView.setText(inputTypes.get(counter).name);
        editText.setInputType(inputTypes.get(counter).value);
        editText.setSelection(editText.getText().length());
        counter++;
    }

    private void startOver() {
        counter = 0;
        textView.setText("");
        editText.setInputType(InputType.TYPE_CLASS_TEXT);
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }


    private void initArray() {
        inputTypes = new ArrayList<>();
        inputTypes.add(new InputTypeItem("date",  InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE));
        inputTypes.add(new InputTypeItem("datetime", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("none", InputType.TYPE_NULL));
        inputTypes.add(new InputTypeItem("number",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("numberDecimal",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL));
        inputTypes.add(new InputTypeItem("numberPassword",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("numberSigned", InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED));
        inputTypes.add(new InputTypeItem("phone",  InputType.TYPE_CLASS_PHONE));
        inputTypes.add(new InputTypeItem("text",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("textAutoComplete", InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE));
        inputTypes.add(new InputTypeItem("textAutoCorrect",  InputType.TYPE_TEXT_FLAG_AUTO_CORRECT));
        inputTypes.add(new InputTypeItem("textCapCharacters",  InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS));
        inputTypes.add(new InputTypeItem("textCapSentences",  InputType.TYPE_TEXT_FLAG_CAP_SENTENCES));
        inputTypes.add(new InputTypeItem("textCapWords",  InputType.TYPE_TEXT_FLAG_CAP_WORDS));
        inputTypes.add(new InputTypeItem("textEmailAddress",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textEmailSubject", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT));
        inputTypes.add(new InputTypeItem("textFilter",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER));
        inputTypes.add(new InputTypeItem("textLongMessage",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE));
        inputTypes.add(new InputTypeItem("textMultiLine",  InputType.TYPE_TEXT_FLAG_MULTI_LINE));
        inputTypes.add(new InputTypeItem("textNoSuggestions", InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
        inputTypes.add(new InputTypeItem("textPassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("textPersonName", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME));
        inputTypes.add(new InputTypeItem("textPhonetic",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC));
        inputTypes.add(new InputTypeItem("textPostalAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS));
        inputTypes.add(new InputTypeItem("textShortMessage", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE));
        inputTypes.add(new InputTypeItem("textUri",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI));
        inputTypes.add(new InputTypeItem("textVisiblePassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
        inputTypes.add(new InputTypeItem("textWebEditText",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT));
        inputTypes.add(new InputTypeItem("textWebEmailAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textWebPassword", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD));
        inputTypes.add(new InputTypeItem("time", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME));
    }

    class InputTypeItem {
        private String name;
        private int value;
        InputTypeItem(String name, int value) {
            this.name = name;
            this.value = value;
        }
    }
}

Veja também

Suragch
fonte
29

eu resolvi tudo com

.setInputType(InputType.TYPE_CLASS_NUMBER);

para ver dados claros e

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

para ver os pontos (se os dados são um número, não é uma opção para outra classe)

pele
fonte
Isso funcionou, obrigado! Uma pergunta, por que preciso adicionar 'ou' ao mudar de texto sem formatação para o tipo de senha? Por que não posso simplesmente fazer isso: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD) ;? Eu tentei e não funcionou.
UnknownUser
15

Para permitir apenas números:

password1.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_CLASS_NUMBER);

Para transformar (ocultar) a senha:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());
slinden77
fonte
7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// você pode alterar TYPE _... de acordo com sua exigência.

Ajeet
fonte
5

Para Kotlin:

    val password = EditText(this)
    password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
    password.hint = "Password"
Ronen
fonte
4

Isso pode ser útil para outras pessoas como eu, que desejam alternar entre senha e modo de texto livre. Tentei usar os métodos de entrada sugeridos, mas funcionou apenas em uma direção. Eu poderia passar da senha para o texto, mas não poderia reverter. Para aqueles que tentam manipular uma alternância (por exemplo, uma caixa de seleção Show Password) use

       @Override
        public void onClick(View v)
        {
            if(check.isChecked())
            {
                edit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                Log.i(TAG, "Show password");
            }
            else
            {
                edit.setTransformationMethod(PasswordTransformationMethod.getInstance());
                Log.i(TAG, "Hide password");
            }
        }

Eu tenho que creditar isso pela solução. Gostaria de ter encontrado isso algumas horas atrás!

Brian Reinhold
fonte
1

Para mostrar a senha:

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

Para ocultar a senha novamente:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
Alif
fonte
0

Tente adicionar isso à tag EditText / TextView no seu layout

android:password="true"

Edit: Acabei de reler sua postagem, talvez você precise fazer isso após a construção. Não vejo por que seu snippet não funcionaria.

Jim Blackler
fonte
Eu não tenho um arquivo de layout neste caso, os campos estão sendo gerados programaticamente.
user246114
Sim, está sendo feito após a construção, não sei por que também não está funcionando!
usar o seguinte comando
6
essa opção agora está obsoleta !!
swiftBoy
essa coisa é apenas uma que funciona para o antigo Android 2.3, eu votei na resposta.
djdance
0

Eu sei a resposta esperada é em Java. Mas aqui estão meus 2 centavos de conselho sempre tente lidar com coisas relacionadas à exibição em XML(pelo menos coisas básicas), então eu sugiro que use um xmlatributo em vez de lidar com esse caso de uso emjava

    <EditText
     android:inputType="textPassword"/>
pratham kesarkar
fonte
2
Em alguns casos, você pode alternar entre diferentes tipos de entrada, por exemplo, ocultar / mostrar a senha inserida em um campo; que é o que me deixa a esta página
William
1
mas para isso existe uma opção no EditText que permite mostrar / ocultar a senha, não é necessário fazer isso por conta própria, mas também fornece uma boa animação para isso.
pratham kesarkar
obrigado pela informação, eu já vi isso aqui stackoverflow.com/a/41163578/3310235
William
0

Ocultar:

edtPassword.setInputType(InputType.TYPE_CLASS_TEXT);
edtPassword.setTransformationMethod(null);

Mostrar:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
miragessee
fonte
0
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);

Além disso, você deve ter cuidado para que o cursor se mova para o ponto inicial do editText depois que essa função for chamada, portanto, mova o cursor para o ponto final novamente.

Vibhanshu Sharma
fonte
0
field.setInputType(InputType.TYPE_CLASS_TEXT);
Sailokesh Aithagoni
fonte