Cómo deshabilitar un botón de Android?

Creé 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?

captura de pantalla del diseño de muestra

¿Has intentado esto?

myButton.setEnabled(false); 

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

No puede habilitarlo ni deshabilitarlo en su XML (dado que su diseño se establece en tiempo de ejecución), pero puede establecer si se puede hacer clic en él al iniciar la actividad con android:clickable .

Usted solo escribe una sola línea de código en su actividad

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

Cuando quiera habilitar el mismo botón solo escriba

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

En Java, una vez que tiene 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 desactivar 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" 

Asi que:

  

Sí, se puede desactivar en XML simplemente usando

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 alguien que tiene un problema similar, lo que funciona para mí es establecer el fondo dibujable de nuevo. Funciona en cualquier nivel de API.

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

En Kotlin, si refiere la Vista de Botón con id entonces, habilite / deshabilite el botón como

layout.xml

  

activity.kt

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

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

  

luego en su código, dentro del método oncreate() configure 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); } }); } 

¡CAMBIO INCORRECTO EN EL ESCUCHA PARA USAR VARIABLE EN LUGAR DE 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 una callback que se invoca cuando se hace clic en una vista.

con la definición del método

 void onClick(View v); 

cuando se hace clic en la vista, el objeto de la clase View hace una callback al método onClick () que envía como parámetro, por lo que el parámetro null no debería ocurrir si es un error de aserción , por ejemplo, cuando la clase de objetos View fue destruida mientras tanto ( ejemplo recogido por GC) o el método fue manipulado debido a hackear

poco sobre instanceof & null

JLS / 15.20.2. Tipo de comparación de operador 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É?

MAYORMENTE PARA EVITAR NullPointerException

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

considerar el siguiente ejemplo:

 View.OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { btnSend.setClickable(false); } }); btnSend.setOnClickListener(listener) btnCancel.setOnClickListener(listener)