¿Cómo hacer que EditText no sea editable a través de XML en Android?


300

¿Alguien puede decirme cómo hacer un EditTextno editable a través de XML? Intenté fijar android:editablea false, pero

  1. está en desuso; y
  2. No funcionó.

66
Si no es editable, ¿por qué necesitarías EditText? ¿No es suficiente usar un TextView ordinario? ¿Y la función setEditable () también está en desuso?
kiki

44
Para mí, esto tiene sentido para permitir copiar y pegar estándar para los contenidos. Con TextView no es posible (al menos no es un comportamiento predeterminado)
Ixx

1
Corrección: es una mala idea. En ciertas circunstancias, la vista se vuelve editable o las opciones de copiar y pegar ya no se muestran. Buscará otro enfoque.
Ixx

11
En mi caso, quiero deshabilitar temporalmente un EditText mientras se realiza un conjunto de operaciones, y luego volver a habilitarlo cuando finalice la operación.
Joe Plante

1
Esta pregunta es sobre una preocupación legítima. Para preservar el EditTextestilo y permitir el desplazamiento, use UI.setReadOnly(myEditText, true)desde esta biblioteca . Hay algunas propiedades que deben establecerse, que puede consultar en el código fuente .
graznido

Respuestas:


399

Use este código simple:

textView.setKeyListener(null);

Funciona.

Editar: para agregar KeyListenermás tarde, haga lo siguiente

1: establecer escucha clave para la etiqueta de textView

textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);

2: obtenga el oyente clave de la etiqueta y vuelva a configurarlo textView

textView.setKeyListener((KeyListener) textView.getTag());

30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); configúrelo más tarde con textView.setKeyListener ((KeyListener) textView.getTag ());
Thomas Dignan

¡@TomDignan es muy fácil de hacer! Tengo una pregunta. ¿Esto de alguna manera cambia los valores predeterminados que necesita KeyListener, como setFocusable()porque el documento dice que la implementación predeterminada podría modificarse si se modifica?
Andy

afaik no, la etiqueta debería estar disponible para que la uses
Thomas Dignan

Hola, su sugerencia me ayudó ... gracias
user1387035

38
La pregunta era sobre configurarlo a través de XML , ¿por qué está marcado como solución?
Denys Vitali

398

Agregue esto a su archivo xml EditText:

<EditText ...
        android:clickable="false" 
        android:cursorVisible="false" 
        android:focusable="false" 
        android:focusableInTouchMode="false">
</EditText>

Hará el mismo efecto que android:editable="false". Trabajó para mí, espero que también funcione para ti.


3
notes.setKeyListener (nulo); notes.setClickable (falso); notes.setCursorVisible (falso); notes.setFocusable (falso); notes.setFocusableInTouchMode (falso);
Jack Franzen

3
Si quieres hacerlo en el XML ... ¿cuál será la diferencia entre él y TextView?
Chris Sim

11
La diferencia es que se puede usar conTextInputLayout
ahmadalibaloch

2
Esto debe marcarse como la solución, ya que es una solución XML pura según lo solicitado en la pregunta.
zgc7009

2
Esto está en desuso (octubre de 2018)
Sebastian Paduano

54

Deje que su Edittext sea

EditText editText;

editText.setKeyListener(null);

funcionará pero simplemente no escucha las teclas.

El usuario puede ver un cursor en el texto de edición.

Puedes probar editText.setEnabled(false);

Eso significa que el usuario no puede ver el cursor. Simplemente decir que se convertirá TextView.


3
Es correcto ya que EditText es una subclase de TextView. Sin embargo, utilice editText como variable en lugar de textView.
Joe Plante

@JoePlante Nombre de variable modificado gracias por comentario constructivo.
Mahendran

esto atenúa el EditText
stephen

EditText en gris indica que está deshabilitado y el usuario no puede editarlo.
Mahendran

Establecer el color y evitará la apariencia de gris. XML: Pruebe android: textColor = "@ color / Black" android: enabled = "false"
Vino tinto

32

Como se menciona en otras respuestas, puede hacer un setEnabled(false) pero ya que está preguntando cómo configurarlo a través de XML, aquí está cómo hacerlo.

Agregue el siguiente atributo a su EditText:

android:enabled="false"

44
respuesta exacta a la pregunta de los OP.
SMR

pero este método en desuso
Lalit kumar

2
@Lalitkumar enabledno está en desuso. editablees.
InsanityOnABun

77
habilitando, no podemos acceder al oyente de clics también. entonces para mí no es la respuesta.
Naveed Ahmad

esto es ocultar texto :(
Chego

24

deshabilitar desde XML (una línea):

 android:focusable="false"

volver a habilitar desde Java, si es necesario (también una línea):

editText.setFocusableInTouchMode(true);

Buena respuesta. De esta manera, aún puede establecer el valor de editText usando editText.setText ("su texto"). Pero el usuario no puede editarlo.
Prakash

17

Hicieron obsoleto "editable" pero no proporcionaron uno correspondiente correspondiente en inputType.

Por cierto, ¿inputType = "none" tiene algún efecto? Usarlo o no no hace ninguna diferencia por lo que veo.

Por ejemplo, se dice que editText predeterminado es una sola línea. Pero debe seleccionar un inputType para que sea una sola línea. Y si selecciona "ninguno", sigue siendo multilínea.


1
No hace una diferencia en todos los dispositivos, pero debería , según los documentos: developer.android.com/reference/android/widget/…
caw

12
Un hermoso ejemplo de Google Mess
Yar

14

Esta combinación me funcionó:

<EditText ... >
    android:longClickable="false"
    android:cursorVisible="false"
    android:focusableInTouchMode="false"
</EditText>

13

Como mencionó android: editable está en desuso. android: inputType = "none" debería usarse en su lugar, pero no funciona debido a un error ( https://code.google.com/p/android/issues/detail?id=2854 )

Pero puedes lograr lo mismo usando enfocable.

Vía XML:

<EditText ...
        android:focusable="false" 
</EditText>

Del código:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);

Cortesía de google, el error caerá en dos escenarios diferentes: 1.) Se solucionará, pero después de 6 años 2.) Nunca se solucionará, solo desarrollarán una nueva versión de Android.
Neon Warge

12

si desea hacer clic en él, pero no desea editarlo, intente:

        android:focusable="false"

8

Solo úsalo android:enabled="false". Esto también dará una apariencia a la EditTextque hará que parezca no editable.


7
<EditText
    android:id="@+id/txtDate"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="2dp"
    android:clickable="false"
    android:cursorVisible="false"
    android:gravity="center" />

y use lo siguiente:

txtDate.setKeyListener(null);

7

Si desea hacerlo en código java, simplemente use esta línea para deshabilitarlo:

editText.setEnabled(false);

Y esto para habilitarlo:

editText.setEnabled(true);

5

Traté de hacer:

textView.setInputType( InputType.TYPE_NULL );

lo que debería funcionar, pero para mí no.

Terminé con este código:

textView.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

    protected char[] getAcceptedChars() {
        return new char[] {};
    }
});

que funciona perfectamente


4

Cuando quiero que una actividad no se centre en EditText y tampoco muestre el teclado al hacer clic, esto es lo que funcionó para mí.

Agregar atributos al diseño principal

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

y luego el campo EditText

android:focusable="false"
android:focusableInTouchMode="false"

Aquí hay un ejemplo:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_home"
    android:background="@drawable/bg_landing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    tools:context="com.woppi.woppi.samplelapp.HomeActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/fromEditText"
        android:layout_weight="1"
        android:hint="@string/placeholder_choose_language"
        android:textColor="@android:color/white"
        android:textColorHint="@android:color/darker_gray"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:onClick="onSelectFromLanguage" />

</RelativeLayout>

4
android:focusable="false"

android:clickable="false"

android:longClickable="false"

El atributo "longClickable" deshabilita las acciones de pulsación prolongada que hacen que las opciones "Pegar" y "Seleccionar todo" se muestren como información sobre herramientas.


3

Además de @mahe madi, puedes probar esto también

editText.setEnabled(false);
editor.setTextColor(Color.BLACK);

Este método ocultará el cursor, perderá el foco y, lo que es más importante, establecerá el color del texto en negro comportándose como TextView.

Y para volver de nuevo a editText simplemente haga esto para obtener todas las propiedades de EditText.

editText.setEnabled(true);

Espero eso ayude :)


3

Podría usarlo, android:editable="false"pero realmente le recomendaría que lo use, setEnabled(false)ya que proporciona una pista visual para el usuario de que el control no se puede editar. Todos los widgets deshabilitados usan la misma señal visual y la consistencia es buena.


2

He intentado lo siguiente:

codeEditText.setInputType(InputType.TYPE_NULL);

this.codeEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

  @Override
  public void onFocusChange(View v, boolean hasFocus) {

    if (hasFocus) {

      pickCode();

    }

  }

});
this.codeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickCode();

  }

});

pero el problema era que si el texto de edición es el primero en el formulario, entonces obtiene el foco y el código pickCode () que inicia una nueva actividad se llama de inmediato. Así que modifiqué el código de la siguiente manera y parece funcionar bastante bien (excepto que no puedo establecer el foco en la edición de texto pero no es necesario):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

Atentamente,

Comentarios bienvenidos,

John Goche


1
Parece funcionar bien, pero ¿no es más fácil usar TextView que se parece a EditText (usando: style = "@ android: style / Widget.EditText")?
Desarrollador de Android

2

Uso EditText.setFocusable(false)y configuro true nuevamente si quiero editar.



2

De esta manera hizo el trabajo por mí, puedo seleccionar y copiar al portapapeles, pero no puedo modificar ni pegar.

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"

1

android: editable está en desuso, así que usa inputType en su lugar.

   <EditText
        android:id="@+id/editText_x"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="70"
        android:inputType="none"
        android:hint="@string/enter_x" />

android: inputType = "none" es muy diferente de android: editable, ¡pruébalo tú mismo!
Denys Vitali

Si va a hacer que su EditText no sea editable, le sugiero que use el widget TextView en lugar del EditText, ya que usar un EditText parece algo inútil en ese caso.
M-Razavi

Su sugerencia no se aplica a EditText con PopupWindow, vea esta imagen para comprender mejor el problema. En este ejemplo, quiero el aspecto de un EditText, pero tengo que "bloquearlo" para permitir que el usuario cambie el valor solo por la ventana emergente. Consulte este tema para ver más motivación. Es un problema que existe desde 2009.
Denys Vitali

1

Me he enfrentado al mismo problema, pero después de la observación descubrí que android:editable="false"solo funciona cuando inputtype ( android:inputType="ANY_VALUE") no se proporciona en Edittext.

Elimine inputType de EditText y use editable = false, funciona bien.


0

Resuelvo esto con un diálogo.

    AlertDialog dialog;
    EditText _editID;
    TextView _txtID;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        _txtID = (TextView) findViewById(R.id._txtID);
        dialog = new AlertDialog.Builder(this).create();
        _editID = new EditText(this);
        _editID.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
        dialog.setTitle("Numero do Registro:");
        dialog.setView(_editID);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "IR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                _txtID.setText(_editID.getText());
                toId(Integer.parseInt((_editID.getText().toString())));
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCELAR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        _txtID.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _txtID.setText("_editID.getText()");
                //_editID.setText("");
                dialog.show();

            }
        });

0

Respuesta corta: solía android:focusable="false"y funcionó. La escucha de clics también funciona ahora.



-10

Prueba este código. Está funcionando en mi proyecto, por lo que funcionará en su proyecto.

android:editable="false"

2
Puedo confirmar que esto no funciona y, además, no se recomienda utilizar el método depreciado.
Adorjan Princz

1
android: editable es en realidad la mejor solución si desea que el campo sea clicable pero no editable, es decir, abrir un cuadro de diálogo después de hacer clic en él.
Yar

no porque funcione en tu proyecto, sino en el nuestro. Muy pobre pensamiento.
Neon Warge
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.