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.

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.


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

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


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)


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

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

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


5

Para Kotlin:

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

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!


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

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.


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

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

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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.