60 votes

Android : Comment mettre à jour le sélecteur(StateListDrawable) par programmation

Je veux mettre à jour le sélecteur pour un bouton de la 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 programmation. 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 cela n'a pas fonctionné.

Et comment le configurer android:state_enabled="false" ou android:state_enabled="true" par programmation.

Merci à l'avance.

115voto

Osi Points 632

Vous devez utiliser la valeur négative de l'état nécessaires. E. g.:

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

Avis le signe "-" avant d' android.R.attr.state_enabled.

5voto

Temperage Points 369

Je vais répondre à votre question "Comment mettre à jour le sélecteur pour un BOUTON par programmation?" en proposant de passer d'un bouton pour un LinearLayout avec embedded ImageView et TextView. Il y a un certain nombre d'avantages à le faire, surtout si vous décidez de personnaliser votre point de vue. Il n'y a pas de perte de fonctionnalité résultant de ce commutateur. Vous serez toujours en mesure de joindre même les écouteurs d'événement que vous pouvez attacher à un bouton, mais sera en mesure d'éviter les boutons/style des onglets de cauchemars. En voici un code à partir de la 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 sélecteur de fichier appelé custom_image.xml situé dans le dossier drawable. Voici le contenu du sélecteur de fichier

<?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 sources de fichiers d'image (disabled_img.png, unselected_img.png, selected_img.png) sont également situés dans le dossier drawable.

Maintenant, revenons à votre code Java. Il n'est pas nécessaire pour le funky StateListDrawable des ordures pour de nombreuses raisons. Tout d'abord, il semble juste laid, et est difficile à maintenir. Mais surtout, il va à l'encontre des principes de garder votre logique distincte de votre présentation. Si vous êtes à la gestion de votre drawable ressources dans du code Java, vous savez que vous faites quelque chose de fundametally mal.

Voici ce que je propose à la place. Chaque fois que vous voulez que votre bouton pour être sélectionné, vous venez de pop ce one-liner là:

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

Ou quand vous le voulez le bouton pour être dans l'état désactivé, voici un autre one-liner:

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

Veuillez noter que, dans ce dernier exemple, je suis en précisant l'état désactivé sur l'ImageView à l'intérieur de la LinearLayout. Pour une raison que chaque fois que vous changez activé / désactivé de l'état de la LinearLayout, le sélecteur n'est pas déclenché. Cela fonctionne bien lorsque vous le faites sur le ImageView à la place.

0voto

raukodraug Points 3280

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

Vous pouvez définir les propriétés de la Vue, tels que l' yourView.setEnabled(true)

J'espère que ça aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X