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.

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.


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

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


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)


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

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

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


5

Para Kotlin:

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

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!


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

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.


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

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

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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.