state_pressed - button android style




Android: comment mettre à jour le sélecteur(StateListDrawable) par programme (4)

Je ne sais pas comment vous ajoutez le StateListDrawable , puisque le code n'est pas là. Mais assurez-vous de vérifier la documentation et l'ajout de setState() .

Vous pouvez définir les propriétés à partir de la vue, par exemple yourView.setEnabled(true)

J'espère que ça aide

Je veux mettre à jour le sélecteur pour un bouton par programmation.

Je peux le faire avec le fichier xml qui est donné ci-dessous

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_enabled="false"
         android:drawable="@drawable/btn_off" />
   <item android:state_pressed="true"
         android:state_enabled="true" 
         android:drawable="@drawable/btn_off" />
   <item android:state_focused="true"
         android:state_enabled="true" 
         android:drawable="@drawable/btn_on" />
   <item android:state_enabled="true" 
         android:drawable="@drawable/btn_on" />
</selector>

Je veux faire la même chose par programme. J'ai essayé quelque chose comme donné ci-dessous

private StateListDrawable setImageButtonState(int index)
{
    StateListDrawable states = new StateListDrawable();

    states.addState(new int[] {android.R.attr.stateNotNeeded},R.drawable.btn_off); 
    states.addState(new int[] {android.R.attr.state_pressed, android.R.attr.state_enabled},R.drawable.btn_off);
    states.addState(new int[] {android.R.attr.state_focused, android.R.attr.state_enabled},R.drawable.btn_on);
    states.addState(new int[] {android.R.attr.state_enabled},R.drawable.btn_on);

    return states;
}

mais ça n'a pas marché.

Et comment configurer android:state_enabled="false" ou android:state_enabled="true" programme.


Je vais répondre à votre question "Comment mettre à jour le sélecteur pour un BOUTON par programme?" en proposant de changer un bouton pour un LinearLayout avec TextView et TextView . Il y a un certain nombre d'avantages à cela, surtout si vous déciderez plus tard de personnaliser vos vues. Il n'y a aucune perte de fonctionnalité résultant de ce commutateur. Vous serez toujours en mesure d'attacher les mêmes écouteurs d'événement que vous pouvez attacher à un bouton, mais vous serez en mesure d'éviter les boutons / onglets de cauchemars. Voici un code pertinent du layout.xml

    <LinearLayout 
        android:id="@+id/button"
        style="@style/ButtonStyle">
        <ImageView 
            android:id="@+id/background"
            android:src="@drawable/custom_image"/>
        <TextView 
            style="@style/TextStyle"
            android:text="Custom Button"
            android:id="@+id/text"/>
    </LinearLayout> 

Ensuite, j'ai un fichier sélecteur appelé custom_image.xml situé dans le dossier drawable. Voici le contenu du fichier sélecteur

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/disabled_img"     android:state_enabled="false" />
    <item android:drawable="@drawable/unselected_img"     android:state_selected="false" />
    <item android:drawable="@drawable/selected_img"     android:state_selected="true" />
</selector>

Les trois fichiers d'image source (disabled_img.png, unselected_img.png, selected_img.png) se trouvent également dans le dossier drawable.

Maintenant, revenons à votre code Java. Il n'y a pas besoin de la poubelle funky StateListDrawable pour de nombreuses raisons. Tout d'abord, il semble juste laid, et est difficile à maintenir. Mais surtout, cela va à l'encontre des principes de séparation de votre logique de votre présentation. Si vous gérez vos ressources dessinables en code Java, vous savez que vous faites quelque chose de fondamentalement faux.

Voici ce que je propose à la place. Chaque fois que vous voulez que votre bouton soit sélectionné, il vous suffit d'insérer cette ligne:

((LinearLayout)findViewById(R.id.button)).setSelected(true);

Ou chaque fois que vous voulez que le bouton soit dans l'état désactivé, voici un autre one-liner:

((ImageView)findViewById(R.id.background)).setEnabled(false);

S'il vous plaît noter que dans ce dernier exemple, je spécifie l'état désactivé sur le ImageView dans le LinearLayout. Pour une raison quelconque, lorsque vous modifiez l'état activé / désactivé du LinearLayout, le sélecteur n'est pas déclenché. Cela fonctionne correctement lorsque vous le faites sur ImageView à la place.


Réponse très tardive ici, mais au cas où quelqu'un d'autre aurait des problèmes pour définir un StateListDrawable par programmation. Puis, comme pour les fichiers XML, l'ordre dans lequel vous définissez les états dans StateListDrawable est important.

Par exemple, cela fonctionnera comme prévu:

StateListDrawable sld = new StateListDrawable();
sld.addState(new int[] { android.R.attr.state_pressed }, new ColorDrawable(Color.GRAY));
sld.addState(new int[] {}, new ColorDrawable(Color.GREEN));

Cela ne va pas:

StateListDrawable sld = new StateListDrawable();
sld.addState(new int[] {}, new ColorDrawable(Color.GREEN));
sld.addState(new int[] { android.R.attr.state_pressed }, new ColorDrawable(Color.GRAY));

Vous devez utiliser la valeur négative de l'état nécessaire. Par exemple:

states.addState(new int[] {-android.R.attr.state_enabled},R.drawable.btn_disabled);

Notez le signe "-" avant android.R.attr.state_enabled .





state