¿Cómo deshabilitar un botón de Android?

371

He creado un diseño que contiene dos botones, Siguiente y Anterior. Entre los botones estoy generando algunas vistas dinámicas. Entonces, cuando inicio la aplicación por primera vez, quiero deshabilitar el botón "Anterior" ya que no habrá vistas anteriores. También quiero desactivar el botón "Siguiente" cuando no hay más vistas para mostrar. ¿Hay alguna forma de deshabilitar los botones?

captura de pantalla del diseño de muestra

Dijo David
fuente

Respuestas:

802

¿Intentaste esto?

myButton.setEnabled(false); 

Actualización: Gracias a Gwen. Casi olvidé que android:clickablese puede configurar en su diseño XML para determinar si se puede hacer clic en un botón o no.

Varun
fuente
66
el equivalente es android: habilitado en xml.
Namratha
1
¿Y dónde encontraste eso en la documentación? ¿Puedes vincularlo aquí?
Varun
44
@Namratha funciona solo para widgets "Button", no para imageView como un botón
mehmet
Equivalente de Xamarin: myButton.Enabled = false;
Cameron Forward
48

No puede habilitarlo o deshabilitarlo en su XML (ya que su diseño está configurado en tiempo de ejecución), pero puede configurarlo si se puede hacer clic en el inicio de la actividad con android:clickable.

Gwen
fuente
44
¡5 años de experiencia en Android y conozco esto AHORA! : /
Sagar
35

Simplemente escriba una sola línea de código en su actividad

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);

Cuando quieras habilitar el mismo botón solo escribe

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
Deepak Sharma
fuente
20
Eso es 2 líneas. Este es uno. ((Button)findViewById(R.id.mybutton)).setEnabled(false);
Matt Clark
34
Intenta comprender los sentimientos Matt ..;)
Deepak Sharma
30

Sí, se puede deshabilitar en XML simplemente usando:

<Button
android:enabled="false"
/>
Mulaffer
fuente
2
Esta es la respuesta real para xml. Toda esa tontería de jugar con clics no tiene nada que ver con cómo se dibuja el botón para que se vea deshabilitado.
Scott Biggs
1
Creo que la gente pensó que no puedes hacer esto porque la finalización del código AS / IDEA no sugiere android:enabledcuándo comienzas a escribirlo. (Incluso hasta el día de hoy.)
Kevin Krumwiede
1
Intenté que no funciona, solo el código setEnabledfunciona
FindOutIslamNow
23

En Java, una vez que tenga la referencia del botón:

Button button = (Button) findviewById(R.id.button);

Para habilitar / deshabilitar el botón, puede usar:

button.setEnabled(false);
button.setEnabled(true);

O:

button.setClickable(false);
button.setClickable(true);

Como desea deshabilitar el botón desde el principio, puede usar button.setEnabled (false); en el método onCreate. De lo contrario, desde XML, puede usar directamente:

android:clickable = "false"

Entonces:

<Button
        android:id="@+id/button"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="@string/button_text"
        android:clickable = "false" />
Paolo Rovelli
fuente
Respondido Dic 8 '10 a las 7:08 Varun
1
@Poldie: En realidad, si lees las dos respuestas, entenderás que son bastante similares pero no iguales.
Paolo Rovelli
9

En mi caso,

myButton.setEnabled(false);
myButton.setEnabled(true);

está funcionando bien y está habilitando y deshabilitando el botón como debería. Pero una vez que el estado del botón se deshabilita, nunca vuelve al estado habilitado nuevamente, aunque se puede hacer clic en él. Intenté invalidar y refrescar el estado dibujable, pero no tuve suerte.

myButton.invalidate();
myButton.refreshDrawableState();

Si usted o alguien que tiene un problema similar, lo que funciona para mí es configurar el fondo dibujable nuevamente. Funciona en cualquier nivel de API.

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
ayorhan
fuente
8

En Kotlin, si hace referencia a la Vista de botones con id, active / desactive el botón como

layout.xml

<Button
   android:id="@+id/btn_start"
   android:layout_width="100dp"
   android:layout_height="50dp"
   android:text="@string/start"
   android:layout_alignParentBottom="true"/>

actividad.kt

  btn_start.isEnabled = true   //to enable button
  btn_start.isEnabled = false  //to disable button
Sackurise
fuente
2

primero en xml haz el botón como android:clickable="false"

<Button
        android:id="@+id/btn_send"
        android:clickable="false"/>

luego en su código, dentro del oncreate()método establezca la propiedad del botón como

btn.setClickable(true);

luego dentro del botón, haga clic en cambiar el código en

btn.setClickable(false);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    btnSend = (Button) findViewById(R.id.btn_send);
    btnSend.setClickable(true);
    btnSend.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            btnSend.setClickable(false);

        }
    });
}
rajeesh
fuente
2

MANERA INCORRECTA EN EL ESCUCHADOR PARA USAR VARIABLE EN LUGAR DEL PARÁMETRO !!!

btnSend.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);

    }
});

MANERA CORRECTA:

btnSend.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

        /** check given view  by assertion or cast as u wish */
        if(v instance of Button) {

            /** cast */
            Button button = (Button) v;

            /** we can perform some check up */
            if(button.getId() == EXPECTED_ID) {

                /** disable view */
                button.setEnabled(false)            
                button.setClickable(false); 
            }

        } else {

             /** you can for example find desired view by root view  */
             Button bt = (Button) v.getRootView().findViewById(R.id.btId);

             /*check for button */
             if(bt!=null) {

                 /** disable button view */
                 ...
             } else {
                 /** according to @jeroen-bollen remark
                   * we made assumption that we expected a view
                   * of type button here in other any case  
                   */
                  throw new IllegalArgumentException("Wrong argument: " +
                         "View passed to method is not a Button type!");
             }
          }
       }
    });

EDITAR: en respuesta a @ jeroen-bollen

 View.OnClickListener 

es la definición de interfaz para que se invoque una devolución de llamada cuando se hace clic en una vista.

con definición de método

void onClick(View v);

cuando se hace clic en la vista, el objeto de la clase Ver hace una devolución de llamada al método onClick () que se envía como parámetro en sí mismo, por lo que el parámetro de vista nula no debería ocurrir si lo hace es un Error de aserción , por ejemplo, cuando la clase de objeto Ver se destruyó mientras tanto (para ejemplo recogido por GC) o el método fue alterado debido a un pirateo

poco sobre instanceof & null

JLS / 15.20.2. Operador de comparación de tipos instanceof

En tiempo de ejecución, el resultado del operador instanceof es verdadero si el valor de RelationalExpression no es nulo y la referencia se puede convertir al ReferenceType sin generar una ClassCastException.

De lo contrario, el resultado es falso .


tres palabras del autor

SI PREGUNTAS POR QUÉ

PARA EVITAR NULLPointerException

Un poco más de código le ahorrará tiempo en el seguimiento posterior de errores en su código y reduce la aparición de anomalías.

considere el siguiente ejemplo:

View.OnClickListener listener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
ceph3us
fuente
2
Parece que cada vez que se llama a la expresión else, el código ya está dañado. Esperaba un botón, pero se pasó algo más. Usted debe lanzar una excepción cuando vno es una Button.
Jeroen
No es exactamente lo que quise decir, pero una mejora no obstante.
Jeroen
@JeroenBollen eelaborate por favor :) ok, solo veo una cosa que no es consistente, es un mensaje de excepción sobre "vista incorrecta pasada al método". Además, es solo un intento de mostrar cómo debería verse.
ceph3us
Quise decir que cuando la función en sí recibe nulo, ya es un error y debería arrojar una excepción.
Jeroen
1

Con Kotlin puedes hacer,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
Todo es variedad
fuente