J'ai un tel problème - je veux rendre la barre de défilement de Spinner toujours visible. Mais pour la fonction Spinner
AndroidRuntime(2252): FATAL EXCEPTION: main AndroidRuntime(2252): java.lang.NullPointerException AndroidRuntime(2252): at android.view.View.onDrawScrollBars(View.java:5836) AndroidRuntime(2252): at android.view.View.draw(View.java:6799) AndroidRuntime(2252): at android.view.ViewGroup.drawChild(ViewGroup.java:1640) AndroidRuntime(2252): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) AndroidRuntime(2252): at android.view.ViewGroup.drawChild(ViewGroup.java:1638) AndroidRuntime(2252): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) AndroidRuntime(2252): at android.view.View.draw(View.java:6796) AndroidRuntime(2252): at android.widget.FrameLayout.draw(FrameLayout.java:352) AndroidRuntime(2252): at android.view.ViewGroup.drawChild(ViewGroup.java:1640) AndroidRuntime(2252): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) AndroidRuntime(2252): at android.view.ViewGroup.drawChild(ViewGroup.java:1638) AndroidRuntime(2252): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) AndroidRuntime(2252): at android.view.View.draw(View.java:6796) AndroidRuntime(2252): at android.widget.FrameLayout.draw(FrameLayout.java:352) AndroidRuntime(2252): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2078) AndroidRuntime(2252): at android.view.ViewRoot.draw(ViewRoot.java:1433) AndroidRuntime(2252): at android.view.ViewRoot.performTraversals(ViewRoot.java:1175) AndroidRuntime(2252): at android.view.ViewRoot.handleMessage(ViewRoot.java:1753) AndroidRuntime(2252): at android.os.Handler.dispatchMessage(Handler.java:99) AndroidRuntime(2252): at android.os.Looper.loop(Looper.java:123) AndroidRuntime(2252): at android.app.ActivityThread.main(ActivityThread.java:4632) AndroidRuntime(2252): at java.lang.reflect.Method.invokeNative(Native Method) AndroidRuntime(2252): at java.lang.reflect.Method.invoke(Method.java:521) AndroidRuntime(2252): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871) AndroidRuntime(2252): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) AndroidRuntime(2252): at dalvik.system.NativeStart.main(Native Method)
6 Réponses :
Après une enquête initiale, je pense que cela n'est pas possible d'appeler J'ai lu la mise en œuvre de la classe setscrollbarfadingenabled (false); code> dans une spinner.
Spinner. java code> et
vue.java code> (ce dernier implémente le
setscrollbarfadingenabled (booléen) code> de l'API16 et le problème est la ligne: p>
cache.scrollBar.setAlpha(255);
Spinner n'a pas de barre de défilement, vous obtenez donc NullPointerException. P>
La popup affichée par Spinner a une barre de défilement. Vous devez donc modifier les propriétés de la liste de liste affichée par Spinner. Mais ListView elle-même n'est pas exposée par Spinner par des méthodes publiques. p>
Même si vous obtenez la liste ListPopuWindow par réflexion, un autre problème se pose, que ListPopupwindow's ListView est uniquement créé après avoir cliqué sur la fileuse. p>
Mais OnClickListener de la fileuse ne peut pas être enregistré, pour définir les propriétés ListView après le spectacle. P>
Vous pouvez créer une fileuse personnalisée avec PerformClick remplacé puis obtenir MPOPUP par réflexion. et utilisez Mais si vous allez créer un spinner personnalisé, je pense qu'il est plus facile de mettre en œuvre l'ensemble de la fenêtre contextuelle en fonction de vos besoins que d'utiliser la réflexion. P> mpopup.getlistview (). Setscrollbarfadingenabled (FALSE) CODE> P>
Ok, merci pour la réponse, c'est pratiquement la même chose que je pensais. Assez triste.
Merci @nondeh em> pour sa réponse et aussi @ g.fouad em> pour Sa réponse sur une autre page . public class VisibleScrollbarSpinner extends Spinner {
@Override public boolean performClick() {
final boolean superResult = super.performClick();
try {
final Field mPopupField = Spinner.class.getDeclaredField("mPopup");
mPopupField.setAccessible(true);
//noinspection ConstantConditions
((ListPopupWindow) mPopupField.get(this)).getListView().setScrollbarFadingEnabled(false);
mPopupField.setAccessible(false);
} catch (NoSuchFieldException | IllegalAccessException e) {
Log.e(TAG, e.toString(), e);
}
return superResult;
}
public VisibleScrollbarSpinner(Context context) { super(context); }
public VisibleScrollbarSpinner(Context context, int mode) { super(context, mode); }
public VisibleScrollbarSpinner(Context context, AttributeSet attrs) { super(context, attrs); }
public VisibleScrollbarSpinner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
public VisibleScrollbarSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) { super(context, attrs, defStyleAttr, mode); }
}
J'ai remarqué que "SetScrollBarFadingenableD" Méthode Java et "FADECROLLLARBAR" La méthode XML ne fait aucun effet sur Spinner car la vue de la liste de Spinner est enveloppée dans une boîte de dialogue (popup), de sorte que ces propriétés n'atteignent pas la listview.
Mais ce qui atteint réellement la liste de la vue de Spinner est à thème. p>
Donc, il suffit de créer un thème personnalisé comme celui-ci: p> et ajoutez-le à Spinner comme ceci: p> essayé et testé! p> p> p>
Dans votre thème de votre application ou votre activité:
<style name="SpinnerStyle1" parent="Widget.AppCompat.ListView.DropDown"> <item name="android:divider">@color/blackText</item> <item name="android:dividerHeight">1px</item> <item name="android:scrollbarAlwaysDrawVerticalTrack">true</item> </style>
Comme il n'est pas facile d'accéder au sous-jacent Créer un style dans styles.xml et définir puis réglez-le dans le thème Spinner: p> listview code> de la spinner, j'ai trouvé une solution simple pour cela.
ScrollBarFadeDuration Code> à une valeur sans fin. p>
<Spinner
...
android:theme="@style/AlwaysEnableScrollBar"/>
Pouvons-nous voir du logcat? Merci.
Est-ce que cela se produit sur tous les niveaux d'API?
@Nandeesh Je sais avec certitude que cela se produit depuis l'API 15. Pas sûr des niveaux mineurs.