¿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ó.
Fran Fitzpatrick
fuente
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());
Kristiono Setyadi
fuente
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.

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

Mahendran
fuente
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"
vida
fuente
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);
kouretinho
fuente
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.

Timuçin
fuente
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>
Massimo Fazzolari
fuente
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);
Adorjan Princz
fuente
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"
Kai Wang
fuente
8

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

Shahid Sarwar
fuente
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);
askimp
fuente
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);
usuario3185897
fuente
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

saric
fuente
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>
Woppi
fuente
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.

Radhey
fuente
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 :)

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

jclafuente
fuente
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

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

nobjta_9x_tq
fuente
2

Prueba esto :

android:inputType="none"
Rutvik
fuente
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"
León
fuente
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" />
M-Razavi
fuente
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.

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

            }
        });
João Scheleder Neto
fuente
0

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

Anbuselvan Rocky
fuente
-1

Tratar

.setInputType(InputType.TYPE_NULL);
benmakp benmakn
fuente
-10

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

android:editable="false"
user2309848
fuente
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