web-dev-qa-db-fra.com

Comment faire en sorte que l'état "désactivé" d'un spinner soit désactivé?

Lorsque je désactive mon spinner, il a presque exactement la même apparence qu'avant, c'est-à-dire.

Avant

enter image description here

Après

enter image description here

Il est désactivé et donc fonctionnellement, tout va bien, mais j'aimerais que regarde soit désactivé. Cette question semble avoir été posée autour des pièges (ici et ici par exemple), mais la réponse la plus proche est celle de this, qui semble incomplet et que je ne comprends pas quand même?!?

Romain a dit cela devait être corrigé dans Froyo, mais j'utilise Honeycomb et, comme vous pouvez le voir sur les captures d'écran, cela ne semble pas fonctionner. Tout avis sera le bienvenu.

28
MisterWeary

Je ne sais pas si vous en avez toujours besoin, mais il y a un moyen. J'ai moi-même eu du mal avec ce problème. J'ai fini par faire quelque chose comme ça:

((Spinner) spinner).getSelectedView().setEnabled(false);
spinner.setEnabled(false);

En fait, cela désactive le compteur et l'élément sélectionné qui est affiché. Il est fort probable que l'élément sélectionné est un TextView et qu'il devrait apparaître comme un TextView désactivé.

J'utilise ceci et cela fonctionne. Mais pour une raison inconnue pour moi, ce n'est pas aussi "grisé" que d'autres vues désactivées. Il semble toujours désactivé cependant. Essaye le.

43
Bandreid

Une façon habile de donner l’impression que les fileuses ont l'air handicapée est de réduire la transparence. 

Spinner spinner = (Spinner) findViewById(R.id.my_spinner);
spinner.setEnabled(false);
spinner.setAlpha(0.5f);
5
PaulrBear

Si vous créez un adaptateur avec une mise en page personnalisée (c'est-à-dire, étendant R.layout.simple_spinner_item), ajoutez cet attribut au XML: Android:duplicateParentState="true"

4
rymo
((Spinner) spnr).getSelectedView().setEnabled(false);
((Spinner) spnr).setEnabled(false);

spnr est mon objet Spinner qui fait référence au fichier de vue XML, par findViewById(...).

3
Randika Vishman

La .getSelectedView() n'a pas fonctionné pour moi. J'ai donc dupé la Spinner à show étant désactivé.

Vous devrez définir vos propres couleurs pour le look disabled.

Par exemple:

R.color.blue_text //means enabled
R.color.gray_text //means disabled

Donc, pour désactiver mon spinner:

((TextView)mySpinner.getChildAt(0)).setTextColor(getResources().getColor(R.color.gray_text));
mySpinner.setEnabled(false);
mySpinner.setFocusable(false);

Pour activer mon spinner:

((TextView)mySpinner.getChildAt(0)).setTextColor(getResources().getColor(R.color.blue_text));
mySpinner.setEnabled(true);
mySpinner.setFocusable(true);

Vous n'avez pas besoin de changer de style ni de modifier le XML. Faites cela dans votre code, même dans les méthodes d'événement, ça devrait aller.

1
Arlyn

cela a fonctionné pour moi…. Pour désactiver le spinner

your_spinner.getSelectedView();
your_spinner.setEnabled(false);

et permettant le retour 

your_spinner.setEnabled(true);
1
ashish.n

J'ai essayé ce qui suit et cela fonctionne comme prévu pour moi:

_userMembership.setEnabled(false);
_userMembership.setClickable(false);
_userMembership.setAlpha((float)0.7);
_userMembership.setBackgroundColor(Color.GRAY);
1
Rabia Abu Hanna

J'ai trouvé que c'était la meilleure solution à la même question à laquelle @ JSPDeveloper01 avait déjà répondu: https://stackoverflow.com/a/20401876/8041634

Étant donné qu'Android ne grise pas le compteur lorsque celui-ci est désactivé, il suggère de créer une méthode personnalisée qui utilise la commande .setAlpha sur le compteur, ce qui grise le texte qu'elle contient. Brillant.

0
shagberg

Vous pouvez également vous passer de la conversion de typographie comme suit:

new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
             // Depend on your selection check position and disable it
             if(position == 1) {
                view.setEnabled(false);
                view.setEnabled(false);
             }
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }
 }
0
Pankaj

Le mien peut être un cas spécial, soit en raison de l'ordre dans lequel je configure mon adaptateur, soit en raison du fait que j'utilise deux spinner personnalisés classes:

  1. La première classe étend la classe LinearLayout, et 
  2. La seconde étend la classe Spinner.

Les clés que j'ai trouvées pour que le spinner ait l'air handicapé étaient:

  1. Invalidation de l'ancien objet dans la fonction setEnabled, et
  2. Définition de la couleur dans la fonction onDraw.

Dans ces deux classes spinner personnalisées, j'ai une fonction setEnabled spéciale comme celle-ci, qui invalide l'ancienne vue:

public void setEnabled(Boolean enabled) {
    super.setEnabled(enabled);
    invalidate();
}

Je remplace également la fonction onDraw dans chaque chaque spinner personnalisé class:

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if (this.getChildAt(0) != null) {
        this.getChildAt(0).setAlpha(this.isEnabled() ? 1.0f : 0.7f);
    }
}
0
thecoolmacdude

Les vues peuvent être composées par plusieurs éléments touchables. Vous devez tous les désactiver, comme ceci:

for(View lol : your_spinner.getTouchables() ) {
    lol.setEnabled(false);
}

Si c'est simple puisqu'il retourne aussi:

Recherchez et retournez toutes les vues palpables qui sont les descendants de cette vue, y compris éventuellement cette vue si elle est touchable elle-même.

Voir # getTouchables ()

0
josetapadas

J'ai eu un problème similaire, sauf que getChildView a renvoyé la valeur null pour moi, donc la solution exceptée ne fonctionnait pas ... Je pense que cela est dû au fait que j'ai défini l'adaptateur en XML, ce qui a ignoré les attributs "cliquable" et "activé".

C'était mon XML:

<Spinner
Android:id="@+id/my_id"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="@dimen/spacing_large"
Android:alpha="0.86"
Android:enabled="false"
Android:clickable="false"
Android:entries="@array/array_of_entries"
Android:spinnerMode="dropdown"/>

La solution pour moi était de supprimer les attributs "activé" et "cliquable" .__ et de placer le code suivant dans mon "onCreate"

spinner.setEnabled(false);

J'espère que ça aide quelqu'un!

0
maxandron