Lorsque je désactive mon spinner, il a presque exactement la même apparence qu'avant, c'est-à-dire.
Avant
Après
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.
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.
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);
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"
((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(...)
.
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.
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);
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);
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.
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) {
}
}
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:
LinearLayout
, et Spinner
.Les clés que j'ai trouvées pour que le spinner ait l'air handicapé étaient:
setEnabled
, etonDraw
.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);
}
}
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.
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!