Establecer inputType para un EditText programáticamente?

216

¿Cómo establecemos el tipo de entrada para un EditText programáticamente? Lo estoy intentando:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

No parece tener ningún efecto.

usuario246114
fuente

Respuestas:

213

Según los documentos de TextView , la versión programática de android: password es setTransformationMethod () , no setInputType (). Entonces algo como:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

debería hacer el truco.

rascado
fuente
44
Solo para agregar a esto, debe llamar a setTransformationMethod en lugar de setInputType. Llamar a setInputType después de setTransformationMethod hace que EditText no vuelva a estar en modo de contraseña.
Paul Ryland
11
esta respuesta es incorrecta para la pregunta que se hace. Esto solo transforma el texto ingresado en EditText(reemplaza los caracteres con puntos de contraseña). Esto no tiene ningún efecto sobre lo que se permite ingresar en EditTextsí mismo.
slinden77
44
setInputType finalmente llama a setTransformationMethod desde dentro, por lo que si pasa TYPE_TEXT_VARIATION_PASSWORD a setInputType, lo hará por usted. El problema parece surgir al llamar a setSingleLine después de llamar a setInputType, que llamará a setTransformationMethod con nulo o el transformador de línea única, lo que borrará el transformador de contraseña.
sparkym3
después de la llamada setTransformationMethod (PasswordTransformationMethod.getInstance ()) no puedo editarlo
el
pero la contraseña aparecerá en el texto sugerido la próxima vez que se use el campo
Gary Davies
408

Para configurar el tipo de entrada para un EditText mediante programación, debe especificar que el tipo de clase de entrada es texto.

editPass.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
Amitku
fuente
2
¡Tu propina funcionó perfectamente para mí! Tuve un problema similar con la configuración programática del tipo de entrada en multilínea.
Anna Lam
¿Cuál es el significado de tener un operador OR bit a bit aquí? Lo siento, soy nuevo en Android.
sanjeev
No estoy de acuerdo InputType.TYPE_TEXT_VARIATION_PASSWORD no funciona para mí, pero setTransformationMethod (PasswordTransformationMethod.getInstance ()); hace !
Lluis Felisart
37

Estos son los distintos tipos de entrada que se muestran en el teclado estándar.

demo de tipos de entrada

Establecer el tipo de entrada mediante programación

editText.setInputType(InputType.TYPE_CLASS_TEXT);

Otras opciones además TYPE_CLASS_TEXTse pueden encontrar en la documentación .

Establecer el tipo de entrada en XML

<EditText
    android:inputType="text"
/>

Otras opciones además textse pueden encontrar en la documentación .

Código suplementario

Aquí está el código para la imagen de arriba.

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

Ver también

Suragch
fuente
29

He resuelto todo con

.setInputType(InputType.TYPE_CLASS_NUMBER);

para ver datos claros y

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

para ver los puntos (si los datos son un número, no es elección de otra clase)

tacaño
fuente
Esto funcionó, gracias! Una pregunta, ¿por qué necesito agregar 'o' al cambiar de texto sin formato a tipo de contraseña? ¿Por qué no puedo simplemente hacer esto: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD) ;? Lo intenté y no funcionó.
Usuario desconocido
15

Para permitir solo números:

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

Para transformar (ocultar) la contraseña:

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

// puedes cambiar TYPE _... de acuerdo a tus requerimientos.

Ajeet
fuente
5

Para Kotlin:

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

Esto puede ser de ayuda para otras personas como yo que desean alternar entre la contraseña y el modo de texto libre. Intenté usar los métodos de entrada sugeridos, pero solo funcionó en una dirección. Podía pasar de la contraseña al texto, pero luego no podía volver. Para aquellos que intentan manejar una palanca (por ejemplo, una casilla de verificación Mostrar contraseña) 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");
            }
        }

Tengo que dar crédito a esto por la solución. ¡Ojalá lo hubiera encontrado hace unas horas!

Brian Reinhold
fuente
1

Para mostrar la contraseña:

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

Para ocultar la contraseña nuevamente:

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

Intente agregar esto a la etiqueta EditText / TextView en su diseño

android:password="true"

Editar: Acabo de volver a leer tu publicación, tal vez necesites hacer esto después de la construcción. No veo por qué tu fragmento no funcionaría.

Jim Blackler
fuente
No tengo un archivo de diseño en este caso, los campos se generan mediante programación.
user246114
Sí, se está haciendo después de la construcción, ¡tampoco estoy seguro de por qué no funciona!
user246114
66
¡Esta opción ahora está en desuso!
swiftBoy
Esta cosa es solo una que funciona para el viejo Android 2.3, he votado la respuesta.
djdance
0

Sé que la respuesta esperada está adentro Java. Pero aquí están mis 2 centavos de consejo, siempre trate de manejar cosas relacionadas con la vista en XML(al menos cosas básicas), por lo que sugeriría usar un xmlatributo en lugar de manejar este caso de uso enjava

    <EditText
     android:inputType="textPassword"/>
pratham kesarkar
fuente
2
En algunos casos, es posible que desee alternar entre diferentes tipos de entrada, por ejemplo, ocultar / mostrar la contraseña ingresada en un campo; que es lo que me permitió visitar esta página
William
1
pero para eso hay una opción en EditText que te permite mostrar / ocultar la contraseña, no es necesario que lo hagas por tu cuenta y también ofrece una buena animación para eso.
pratham kesarkar
gracias por la información, la he visto aquí stackoverflow.com/a/41163578/3310235
William
0

Esconder:

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

Mostrar:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
Miragessee
fuente
0
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);

también debe tener cuidado de que el cursor se mueva al punto de inicio de editText después de invocar esta función, así que asegúrese de mover el cursor al punto final nuevamente.

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