2010-12-08 55 views
276

He creado un diseño que contiene dos botones, Siguiente y Anterior. Entre los botones estoy generando algunas vistas dinámicas. Por lo tanto, cuando lance la aplicación por primera vez, quiero desactivar 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 desactivar los botones?Cómo deshabilitar un botón de Android?

screen shot of sample layout

Respuesta

616

¿Usted intentó esto?

myButton.setEnabled(false); 

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

+17

Sin equivalente XML :-( – Blundell

+47

el equivalente es android: habilitado en xml. – Namratha

+1

¿Y dónde lo encontraste en la documentación? ¿Puedes vincularlo aquí? – Varun

41

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

+0

¡5 años de experiencia en Android y conozco esto AHORA! :/ – Sagar

26

que acaba de escribir una sola línea de código en su actividad

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

Cuando desea habilitar el mismo botón acaba de escribir

Button btn = (Button) findViewById(R.id.button1); 
btn.setEnabled(true); 
+17

Eso es ** 2 ** líneas. Este es uno. '((Button) findViewById (R.id.mybutton)). SetEnabled (false);' –

+27

Trate de entender los sentimientos Matt ...;) –

6

En mi caso,

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

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

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

Si usted o cualquier persona que tenga un problema similar, lo que funciona para mí está fijando el dibujable fondo nuevo. Funciona en cualquier nivel de API.

myButton.setEnabled(true); 
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable)); 
20

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

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

Para activar/desactivar el botón, puede utilizar cualquiera:

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

O:

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

Como desea desactivar el botón de t El comienzo, puede usar button.setEnabled (false); en el método onCreate. De lo contrario, a partir de XML, puede utilizar directamente:

android:clickable = "false" 

Así:

<Button 
     android:id="@+id/button" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:text="@string/button_text" 
     android:clickable = "false" /> 
+0

respondió 8 de diciembre de 2010 a las 7:08 Varun –

+1

@Poldie: En realidad, si Si lee las dos respuestas, comprenderá que son bastante similares pero no iguales. –

1

por primera vez en XML que el botón como android:clickable="false"

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

entonces en su código, en el interior oncreate() método establecer la propiedad del botón como

btn.setClickable(true); 

continuación, haga clic en el botón dentro de 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); 

     } 
    }); 
} 
7

Sí, se puede desactivar en XML simplemente usando <Button android:enabled="false" />

+0

Esta es la respuesta real para xml. Todas esas tonterías de jugar con clics no tienen nada que ver con cómo se dibuja el botón para que parezca deshabilitado. –

1

MAL CAMINO EN OYENTE DE USO 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!"); 
      } 
      } 
     } 
    }); 

EDIT: En respuesta a @ Jeroen-Bollen

View.OnClickListener 

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

con la definición método

void onClick(View v); 

cuando la vista se hace clic en el objeto vista de clase hace devolución de llamada al método onClick() enviando como parámetro en sí, así que la vista nula parámetro no debería ocurrir si lo hace es un error de aserción que podría ocurrir, por ejemplo, cuando la clase objeto View fue destruido en su parte (por ejemplo, recogida por GC) o el método fue manipulado por piratear

poco sobre instanceof & nula

JLS/15.20.2. Tipo de comparación Operador instanceof

En tiempo de ejecución, el resultado del operador instanceof es cierto si el valor de la RelationalExpression no es nulo y la referencia podría ser arrojado a la ReferenceType sin levantar un ClassCastException.

De lo contrario, el resultado es falso.


tres palabras del Autor

SI U preguntar por qué?

SOBRE TODO PARA EVITAR NullPointerException

poco más código ahorrará su tiempo en la tarde de seguimiento de errores en el código & reduce la aparición de abnomalies.

considere el siguiente ejemplo:

View.OnClickListener listener = new OnClickListener() { 

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

    } 
}); 

btnSend.setOnClickListener(listener) 
btnCancel.setOnClickListener(listener) 
+2

Parece que cada vez que se llamará a la expresión else, el código ya tiene errores. Esperabas un Botón, pero se pasó algo más. Usted * debe * lanzar una excepción cuando 'v' no es un' Botón'. –

+0

@JeroenBollen buen punto que hice editar – ceph3us

+0

No es exactamente lo que quise decir, pero una mejora, no obstante. –

0

En Kotlin, si se hace referencia en el botón Ver con id a continuación, el botón/Desactivar como 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"/> 
permitir

activity.kt

btn_start.isEnabled = true //to enable button 
    btn_start.isEnabled = false //to disable button 
Cuestiones relacionadas