2012-04-04 31 views
4

私はこのような問題があります。スピナーのスクロールバーを常に表示させたいと思います。 GUIの描画時のNullExceptionPointerと しかし、スピナー機能についてスピナーのスクロールバーを常に表示させることはできません(Android)

setScrollbarFadingEnabled(false); 

原因クラッシュ。

XMLタグでもこの問題を解決することはできません。スピナーが無視するように見えます。

多分移動する別の方法がありますか?たとえば、カスタムスクロールバーを使用しますか?はいの場合、どうすればいいですか?

ご回答ありがとうございます。 ドミトリー。私は頼まれてきたように、ここではその中にちょうどスピンナーで単純なプロジェクトのためのLogCatエラーメッセージ

です:

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

いくつかのLogCatを表示できますか?ありがとうございました。 – pablisco

+0

これはすべてのAPIレベルで発生しますか? – nandeesh

+0

@nandeesh私は、API 15以降のことが確実にわかります。マイナーレベルについてはわかりません。 –

答えて

7

Spinnerにスクロールバーがないため、NullPointerExceptionが発生しています。

スピナーで表示されるポップアップにはスクロールバーがあります。したがって、スピナーによって表示されるListViewのプロパティを変更する必要があります。しかし、ListView自体はSpinnerによって公開されることはありません。

ListPopupWindowをリフレクションで取得した場合でも、ListPopupWindowのListViewはSpinnerをクリックした後にのみ作成されるというさらなる問題が発生します。

SpinnerのOnClickListenerは、ショー後にListViewプロパティを設定するために登録することはできません。

performClickオーバーライドを使用してカスタムスピンナーを作成し、リフレクションによってmPopupを取得することができます。 mPopup.getListView().setScrollbarFadingEnabled(false)

しかし、カスタムスピナーを作成する場合は、リフレクションを使用するよりも、必要に応じてポップアップ全体を実装する方が簡単だと思います。

+0

答えてくれてありがとう、実際に私が思ったのと事実上同じです。かなり悲しい。 – Dmitry

+3

+1ありがとうございます。ここに私の実装があります:http://stackoverflow.com/a/19820350/597657 –

0

初期調査の後、私はそれがでsetScrollbarFadingEnabled(false);を呼び出すことはできませんと思っていますスピナー。

私は(この最後の1は、API16のsetScrollbarFadingEnabled(boolean)を実装しており、問題はラインであるクラスSpinner.javaの実装とView.javaを読みました:

cache.scrollBar.setAlpha(255); 

おそらくcache.scrollBarは、この時点ではnullであり、私は見つけるのdidntこの属性のいくつかの初期化を強制する方法。

この属性を管理するほとんどのメソッドはprotectedまたはprivateので、我々はそれらを呼び出すことはできませんされている。

私は可能な解決策を見つけるためにこの問題を研究し続けますが、今のところ、誰もこの質問にまだ答えていないと考えて、私はそれが不可能だと考えています。

0

彼の答えは@nandeesh、またhis/her answer on another pageの@Eng.Fouadに感謝します。

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); } 
} 
関連する問題