2012-04-04 9 views
4

Ich habe ein solches Problem - ich möchte Spinner Scrollbar immer sichtbar machen. Aber für Spinner FunktionKann Spinner Scrollbar nicht immer sichtbar machen (Android)

setScrollbarFadingEnabled(false); 

Ursachen Absturz mit einem NullExceptionPointer während der GUI-Zeichnung.

XML-Tags können dieses Problem auch nicht lösen - es scheint, dass Spinner sie einfach ignoriert.

Vielleicht gibt es noch andere Möglichkeiten sich zu bewegen? Zum Beispiel die Verwendung der benutzerdefinierten Bildlaufleiste? Wenn ja, wie kann ich das tun?

Vielen Dank für Ihre Antworten, Dmitry.

Wie ich bin gebeten worden, hier ist LogCat Fehlermeldung für einfaches Projekt mit nur einer Schleuder drin:

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) 
+0

Können wir etwas LogCat sehen? Vielen Dank. – pablisco

+0

passiert das auf allen API-Ebenen? – nandeesh

+0

@nandeesh Ich weiß sicher, dass seit API 15 passiert. Nicht sicher über geringe Ebenen. –

Antwort

7

Spinner hat keine Bildlaufleiste, daher erhalten Sie NullPointerException.

Das vom Spinner angezeigte Popup hat eine Bildlaufleiste. Sie müssen also die Eigenschaften der ListView ändern, die durch den Spinner angezeigt wird. Aber ListView selbst wird von Spinner nicht mit öffentlichen Methoden verfügbar gemacht.

Auch wenn Sie das ListPopupWindow durch Reflexion erhalten, tritt ein weiteres Problem auf, dass ListPopupWindows ListView erst erstellt wird, nachdem Sie auf den Spinner geklickt haben.

Aber OnClickListener des Spinner kann nicht registriert werden, um die ListView-Eigenschaften nach der Show festzulegen.

Sie könnten einen benutzerdefinierten Spinner mit percollClick überschrieben erstellen und dann mPopup durch Reflexion erhalten. und verwenden Sie mPopup.getListView().setScrollbarFadingEnabled(false)

Aber wenn Sie einen benutzerdefinierten Spinner erstellen, glaube ich, dass es einfacher ist, das gesamte Popup an Ihre Bedürfnisse als die Verwendung von Reflexion zu implementieren.

+0

OK, danke für die Antwort, es ist praktisch das Gleiche, dachte ich. Ziemlich traurig. – Dmitry

+3

+1 Danke. Hier ist meine Implementierung: http://stackoverflow.com/a/19820350/597657 –

0

Nach einer ersten Untersuchung, ich denke, das ist nicht möglich setScrollbarFadingEnabled(false); Aufruf ein Spinner.

Ich habe die Implementierung der Klasse Spinner.java und View.java (diese letzten implementiert die setScrollbarFadingEnabled(boolean) des API16 und das Problem ist die Zeile zu lesen:

cache.scrollBar.setAlpha(255); 

Wahrscheinlich cache.scrollBar an dieser Stelle null ist und ich habe nicht finden eine Möglichkeit, eine Initialisierung dieses Attribut zu erzwingen.

Die meisten Methoden, die dieses Attribut zu verwalten sind geschützt oder privat, so dass wir sie einfach nicht nennen.

Ich werde dieses Problem weiter untersuchen, um eine mögliche Lösung zu finden, aber für den Moment und da niemand diese Frage beantwortet hat, denke ich, dass das nicht möglich ist.

0

Vielen Dank @nandeesh für seine/ihre Antwort und auch @ Eng.Fouad für his/her answer on another 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 (Exception e) { 
      Log.d(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); } 
}