Deshabilitar EditText en Android


195

En mi aplicación, tengo un EditText que el usuario solo tiene acceso de lectura, no acceso de escritura.

En el código que puse android:enabled="false".

Aunque el fondo de EditText cambió a oscuro, cuando hago clic en él, aparece el teclado y puedo cambiar el texto.

¿Qué debo configurar para desactivar EditText?


2
Es posible preservar tanto el estilo de la vista como el comportamiento de desplazamiento. Para deshabilitar EditTextmientras se mantienen estas propiedades, solo utilícelas UI.setReadOnly(myEditText, true)desde esta biblioteca . Si desea replicar este comportamiento sin la biblioteca, consulte el código fuente de este pequeño método.
caw

Respuestas:


245

Creo que lo correcto sería establecer android:editable="false".

Y si te preguntas por qué mi enlace apunta a los atributos de TextView, la respuesta es porque EditTexthereda de TextView:

EditText es una capa delgada sobre TextView que se configura para ser editable.

Actualización:
como se menciona en los comentarios a continuación, editableestá en desuso ( desde el nivel API 3 ). En su lugar, debería estar usando inputType(con el valor none).


gracias Nailuj, desafortunadamente no funcionó. Después de agregar su sugerencia, aparece un teclado emergente y existe la posibilidad de cambiar el texto.
Hesam

17
android: editable está en desuso. android: inputType = "none" debería usarse en su lugar pero contiene error y no funciona Sería bueno si todos destacáramos
Viktor Brešan

85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
Asíntota el

28
android:editable="false" android:focusable="false"funciona muy bien para mí (olvídate de obsoleto, creo que android: editable no tiene nada que ver con android: inputType)
Muhammad Babar

8
Para todos aquellos para quienes android: inputType = "none" no funciona, intente: android: inputType = "none" con android: focusable = "false"
Surendra Kumar

161

use EditText.setFocusable(false) para deshabilitar la edición
EditText.setFocusableInTouchMode(true)para habilitar la edición;


Funciona, pero no es una buena práctica porque parece que la vista puede ser editable pero no puede. Me funcionó bien porque mi vista tenía un fondo personalizado, por lo que +1.
kaneda

44
@kaneda. De hecho, prefiero esto. No quiero que mi caja esté atenuada. :)
Doomsknight

1
En Android 4.4, esta opción mantiene el color del texto original. El uso editText.setEnabled(false);cambiará el color del texto a gris. Sin embargo, los hilanderos no cambian el color del texto cuando se usa setEnabled, lo que lo convierte en una experiencia inconsistente.
tbraun

¿por qué no setFocusable(true)? vea este enlace para ver la diferencia entre setFocusable()y setFocusableInTouchMode(): stackoverflow.com/questions/23799064/…
kenju

Esto realmente se ajusta a mis necesidades. Creé una vista personalizada compuesta con un EditText dentro. Tengo problemas para hacer que la vista personalizada mía solo acepte clics pero no sea editable, ya que esto inicia un cuadro de diálogo de selección de fecha. Esta solución funciona ya que no deshabilita onClickListeners
Neon Warge

64

Puedes probar el siguiente método:

 private void disableEditText(EditText editText) {
    editText.setFocusable(false);
    editText.setEnabled(false);
    editText.setCursorVisible(false);
    editText.setKeyListener(null);
    editText.setBackgroundColor(Color.TRANSPARENT); 
 }

EditText habilitado:

EditText habilitado

EditText deshabilitado:

EditText deshabilitado

Funciona para mí y espero que te ayude.


1
Esto se parece a un TextView. Es tan increíble. Esto es lo que estoy buscando.
Yunus

44
En caso de que alguien tenga el mismo problema con la habilitación de la devolución, debe llamar en editText.setFocusableInTouchMode(true)lugar de editText.setFocusable(true).
Dart Dega

61

Use esto para deshabilitar la entrada del usuario

android:focusable="false"

android: editable = "false" Este método está en desuso.


1
Esta debería ser la respuesta aceptada. Establecer el tipo de entrada en 'ninguno' como se sugiere en otras respuestas no funciona (siempre). La configuración habilitada en 'falso' evita la edición, pero también atenúa el texto que puede o no ser deseado.
jerry

36

Para desactivar la edición EditText, creo que podemos usar focusable OR enable pero

  1. Usando android:enabled=...oeditText.setEnabled(...)

    También cambia el color del texto EditTexta gris.
    Al hacer clic no tiene efecto

  2. Usando android:focusable=...o editText.setFocusable(false)-editText.setFocusableInTouchMode(true)

    No cambia el color del texto de EditText
    Al hacer clic, resalta la EditTextlínea de fondo durante unos pocos milisegundos

Salida

ingrese la descripción de la imagen aquí


19

Como android:editable="false"se describe. Puede usar InputType TYPE_NULL en EditText

usar así:

editText.setInputType(InputType.TYPE_NULL);

1
Me gustó esta respuesta porque no deshabilita el onClickListener en el campo.
Harsh Ganatra

¿Qué hacer si inputType es contraseña? TYPE_NULL hace que la contraseña sea visible.
ilyamuromets

17

Como en android:editable="false"desuso enxml

Usar android:enabled="false"es simple. ¿Por qué usar más código?

Si lo desea java class, también puede usar esto mediante programación

 editText.setEnabled(false);

use android: enabled = "true" para habilitar
android_jain

8

Simplemente:

editText.setEnabled(false);

1
¿Cómo difiere de la respuesta anterior (por lo que se refiere a la pregunta)?
Onik

setFocusable (false) también le permite configurar un OnClickListener.
Oded Breiner

5

Establezca las siguientes propiedades en clase:

editText.setFocusable(false);
editText.setEnabled(false);

Funcionará sin problemas según lo requiera.


solo enabledfue suficiente
ateebahmed

5

Para deshabilitar la funcionalidad de un EditText, simplemente use:

EditText.setInputType(InputType.TYPE_NULL);

en caso de que desee habilitarlo de alguna manera, puede usar:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

¿Qué hacer si inputType es contraseña? TYPE_NULL hace que la contraseña sea visible.
ilyamuromets

4

si lo usa android:editable="false", eclipse le recordará este mensaje "android: editable está en desuso: use inputType en su lugar".

Entonces, en su android:focusable="false"lugar, me funcionó bien.


4
android:editable="false"

ahora está en desuso y uso

 YourEditText.setInputType(InputType.TYPE_NULL);

¿Qué hacer si inputType es contraseña? TYPE_NULL hace que la contraseña sea visible.
ilyamuromets

@ilyamuromets Esta respuesta podría ayudar a stackoverflow.com/a/16720520/7704650 con TYPE_TEXT_VARIATION_PASSWORDSiga esto para más developer.android.com/reference/android/text/InputType
emkarachchi

Quiero deshabilitar la entrada en EditText mientras el teclado virtual está abierto y el usuario intenta ingresar texto. InputType.TYPE_NULL funciona muy bien con isFocusable e isFocusableInTouchMode en valor falso. Pero si inputType del campo de entrada es textPassword, InputType.TYPE_NULL hace que el valor de la contraseña sea visible. Si configuro InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD, luego la contraseña también se hace visible y el usuario puede ingresar texto.
ilyamuromets


3

Deshabilitar = ENFOQUE + CLIC + CURSOR

Desactivar el foco, el clic y la visibilidad del cursor me ayuda.

Aquí está el código en XML

<EditText
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:cursorVisible="false"
    android:clickable="false"
    />

2

Esto hará que su texto de edición esté deshabilitado .

editText.setEnabled(false);

Y al usar esto

editText.setInputType(InputType.TYPE_NULL);

Simplemente hará que su Edittext no muestre su teclado virtual , pero si está conectado a un teclado físico, le permitirá escribir.


¿Qué hacer si inputType es contraseña? TYPE_NULL hace que la contraseña sea visible.
ilyamuromets

2

Yo uso Google recientemente lanzado Biblioteca de diseño de materiales. En mi caso, funciona cuando uso android: focusable = "false" y android: cursorVisible = "false"

<com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/to_time_input_layout"
                    app:endIconMode="custom"
                    app:endIconDrawable="@drawable/ic_clock"
                    app:endIconContentDescription="ToTime"
                    app:endIconTint="@color/colorAccent"
                    style="@style/OutlinedEditTextStyle"
                    android:hint="To Time">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/to_time_edit_text"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:focusable="false"
                        android:cursorVisible="false" />

</com.google.android.material.textfield.TextInputLayout>

1

En mi caso, necesitaba mi EditTextpara desplazar el texto si no. de líneas excede maxLinescuando está deshabilitado. Esta implementación funcionó perfectamente para mí.

private void setIsChatEditTextEditable(boolean value)
{
    if(value)
    {
        mEdittext.setCursorVisible(true);
        mEdittext.setSelection(chat_edittext.length());
       // use new EditText(getApplicationContext()).getKeyListener()) if required below
        mEdittext.setKeyListener(new AppCompatEditText(getApplicationContext()).getKeyListener());  
    }
    else
    {
        mEdittext.setCursorVisible(false);
        mEdittext.setKeyListener(null);
    }
}

1

Prueba este, funciona bien para mí:

public class CustomEdittext extends EditText {

Boolean mIsTextEditor=true;
public CustomEdittext(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

@Override
public boolean onCheckIsTextEditor() {
    // TODO Auto-generated method stub
    return mIsTextEditor;
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    mIsTextEditor=false;
    Boolean mOnTouchEvent=super.onTouchEvent(event);
    mIsTextEditor=true;     
    return mOnTouchEvent;
} }

Nota: debe agregar this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); su actividad o keyboardaparecerá una ventana emergente por primera vez.


1

Como alguna respuesta, menciónelo, si deshabilita editText se vuelve gris y si establece false enfocable, se muestra el cursor.

Si desea hacerlo solo con xml, este fue el truco

       <YourFloatLabel
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

            <EditText
                android:id="@+id/view_ads_search_select"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusable="true"
                android:clickable="true"/>  
       </YourFloatLabel>

Simplemente agrego un FrameLayout que aparece sobre editText y lo configuro enfocable y se puede hacer clic para que editText no se pueda hacer clic.


0

Esto funciona para mi:

android: focusable = "false"


2
¿Cómo es esto diferente de lo que Sampath Kumar publicó hace 4 años?
gobrewers14 de

0

Del comentario de @Asymptote sobre la respuesta aceptada, use:

myEditText.setEnabled(false);
myEditText.setInputType(InputType.TYPE_NULL);

... y Bob es tu tío.


0

Hoy todavía lo uso editable="false", pero también con focusable="false".

Creo que el caso que necesitamos para que un EditText no sea editable, es porque queremos mantener su estilo EditText (con ese subrayado, con una pista, etc.), pero acepta otras entradas en lugar de texto. Por ejemplo una lista desplegable.

En tal caso de uso, necesitamos que se pueda hacer EditTextclic (por lo tanto, enabled="false"no es adecuado). focusable="false"Sin embargo, al configurar este truco, aún puedo mantener presionado el EditText y pegar mi propio texto en el portapapeles . Dependiendo de su código y manejo, esto puede incluso bloquear su aplicación.

Así que también usé editable="false"y ahora todo es genial, excepto la advertencia.


0

puede usar android:focusable="false"pero también debe deshabilitar el cursor; de lo contrario, la función copiar / pegar seguiría funcionando.

entonces, usa

android:focusable="false"
android:cursorVisible="false"

0

Hay múltiples fue cómo lograr múltiples niveles de discapacitados.

  • editText.setShowSoftInputOnFocus(false); y editText.setFocusable

evita que se EditTextmuestre el teclado - escribiendo en algún texto. Pero el cursor todavía es visible y el usuario puede pegar algo de texto.

  • editText.setCursorVisible(false)

Oculta el cursor. No estoy seguro de por qué querrías hacer eso aunque. El usuario puede ingresar texto y pegar.

  • editText.setKeyListener(null)

Encuentro esta manera más conveniente. No hay forma de que el usuario pueda ingresar texto, pero el widget aún funciona OnClickListenersi desea activar la acción cuando el usuario lo toca

  • editText.setEnabled(false);

completamente deshabilita EditText. Literalmente es de 'solo lectura', el usuario no puede ingresar ningún texto y (por ejemplo) OnClickListener no funciona con él.

Documentación TextEdit


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.