J'ai créé une mise en page qui contient deux boutons, Suivant et Précédent. Entre les boutons, je génère des vues dynamiques. Donc, lorsque je lance l'application pour la première fois, je veux désactiver le bouton "Précédent" car il n'y aura pas de vues précédentes. Je souhaite également désactiver le bouton "Suivant" lorsqu'il n'y a plus de vues à afficher. Est-il possible de désactiver les boutons?
Avez-vous essayé cela?
myButton.setEnabled(false);
Mise à jour: Merci à Gwen. Presque oublié que Android:clickable
peut être défini dans votre présentation XML pour déterminer si un bouton peut être cliqué ou non.
Vous ne pouvez pas l'activer ni le désactiver dans votre XML (car votre mise en page est définie au moment de l'exécution), mais vous pouvez définir si elle est cliquable au lancement de l'activité avec Android:clickable
.
Vous venez d'écrire une seule ligne de code dans votre activité
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);
Lorsque vous voulez activer le même bouton, écrivez simplement
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
En Java, une fois que vous avez la référence du bouton:
Button button = (Button) findviewById(R.id.button);
Pour activer/désactiver le bouton, vous pouvez utiliser:
button.setEnabled(false);
button.setEnabled(true);
Ou:
button.setClickable(false);
button.setClickable(true);
Puisque vous souhaitez désactiver le bouton depuis le début, vous pouvez utiliser button.setEnabled (false); dans la méthode onCreate. Sinon, à partir de XML, vous pouvez directement utiliser:
Android:clickable = "false"
Alors:
<Button
Android:id="@+id/button"
Android:layout_height="wrap_content"
Android:layout_width="wrap_content"
Android:text="@string/button_text"
Android:clickable = "false" />
Oui, il peut être désactivé en XML en utilisant simplement:
<Button
Android:enabled="false"
/>
Dans mon cas,
myButton.setEnabled(false);
myButton.setEnabled(true);
fonctionne bien et il active et désactive le bouton comme il se doit. Mais une fois que l'état du bouton est désactivé, il ne revient jamais à l'état activé, bien qu'il soit cliquable. J'ai essayé d'invalider et de rafraîchir l'état dessinable, mais pas de chance.
myButton.invalidate();
myButton.refreshDrawableState();
Si vous ou une personne ayant un problème similaire, ce qui fonctionne pour moi est de redéfinir l'arrière-plan. Fonctionne à n'importe quel niveau d'API.
myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
Dans Kotlin, si vous vous référez à la vue des boutons avec son identifiant, activez/désactivez le bouton comme suit:
layout.xml
<Button
Android:id="@+id/btn_start"
Android:layout_width="100dp"
Android:layout_height="50dp"
Android:text="@string/start"
Android:layout_alignParentBottom="true"/>
activity.kt
btn_start.isEnabled = true //to enable button
btn_start.isEnabled = false //to disable button
WRONG WAY IN LISTENER POUR UTILISER VARIABLE AU LIEU DE PARAMÈTRE !!!
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
DROITE:
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 réponse à @ jeroen-bollen
View.OnClickListener
is Définition de l'interface pour qu'un rappel soit appelé lorsqu'un clic est effectué sur une vue.
avec définition de la méthode
void onClick(View v);
lorsque la vue est cliquée, l'objet de la classe View appelle la méthode onClick () en l'envoyant comme paramètre, le paramètre null view ne doit donc pas exister s'il s'agit d'une erreur d'assertion cela peut se produire, par exemple, lorsque l'objet View la classe a été détruite entre-temps (par exemple, collectée par GC) ou la méthode a été falsifiée en raison d'un piratage
peu sur instanceof & null
JLS/15.20.2. Instance d'opérateur de comparaison de type
Au moment de l'exécution, le résultat de l'opérateur instanceof est true si la valeur de RelationalExpression n'est pas null et que la référence peut être transtypée en ReferenceType sans déclencher une ClassCastException.
sinon le résultat est faux.
trois mots de l'auteur
SI U DEMANDER POURQUOI?
principalement à éviter NullPointerException
Un peu plus de code vous permettra de gagner du temps sur le suivi des bogues dans votre code et de réduire le nombre d'abnomalies.
considérez l'exemple suivant:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)
d'abord en xml faire le bouton comme Android:clickable="false"
<Button
Android:id="@+id/btn_send"
Android:clickable="false"/>
puis dans votre code, dans la méthode oncreate()
, définissez la propriété button comme
btn.setClickable(true);
puis à l'intérieur du bouton cliquez pour changer le code 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);
}
});
}