7
votes

Ne peut pas faire de la barre de défilement de Spinner toujours visible (Android)

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)


3 commentaires

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.


6 Réponses :


0
votes

Après une enquête initiale, je pense que cela n'est pas possible d'appeler setscrollbarfadingenabled (false); code> dans une spinner.

J'ai lu la mise en œuvre de la classe 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);


0 commentaires

9
votes

Spinner n'a pas de barre de défilement, vous obtenez donc NullPointerException.

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.

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.

Mais OnClickListener de la fileuse ne peut pas être enregistré, pour définir les propriétés ListView après le spectacle.

Vous pouvez créer une fileuse personnalisée avec PerformClick remplacé puis obtenir MPOPUP par réflexion. et utilisez mpopup.getlistview (). Setscrollbarfadingenabled (FALSE)

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.


1 commentaires

Ok, merci pour la réponse, c'est pratiquement la même chose que je pensais. Assez triste.



1
votes

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); }
}


0 commentaires

0
votes

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.

Donc, il suffit de créer un thème personnalisé comme celui-ci: xxx

et ajoutez-le à Spinner comme ceci: xxx

essayé et testé!


0 commentaires

0
votes

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>


0 commentaires

0
votes

Comme il n'est pas facile d'accéder au sous-jacent listview code> de la spinner, j'ai trouvé une solution simple pour cela.

Créer un style dans styles.xml et définir ScrollBarFadeDuration Code> à une valeur sans fin. p> xxx pré>

puis réglez-le dans le thème Spinner: p>

<Spinner
    ...
    android:theme="@style/AlwaysEnableScrollBar"/>


0 commentaires