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?

Hesam
fuente
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).

Julian
fuente
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;

Sean Android
fuente
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.

Maksym Kalin
fuente
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.

Sampath Kumar
fuente
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í

Phan Van Linh
fuente
19

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

usar así:

editText.setInputType(InputType.TYPE_NULL);
Bhargav Thanki
fuente
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);
android_jain
fuente
use android: enabled = "true" para habilitar
android_jain
8

Simplemente:

editText.setEnabled(false);
Oded Breiner
fuente
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.

Rango
fuente
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);
hipergogeta
fuente
¿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.

wangzhengyi
fuente
4
android:editable="false"

ahora está en desuso y uso

 YourEditText.setInputType(InputType.TYPE_NULL);
emkarachchi
fuente
¿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

Usar en su TextViewlugar.

cx0der
fuente
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"
    />
Rohit Singh
fuente
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.

Mark Joshua Fajardo
fuente
¿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>
Aminul Haque Aome
fuente
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);
    }
}
Rishabh876
fuente
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.

Favas Kv
fuente
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.

Vodet
fuente
0

Esto funciona para mi:

android: focusable = "false"

Annie
fuente
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.

Tom Howard
fuente
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.

Sira Lam
fuente
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"
M.Usman
fuente
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

Azul profundo
fuente
0

Establezca esto en su código XML, funciona.

android: focusableInTouchMode = "false"

Sujeet Kumar Gupta
fuente