7

私はそのような問題を抱えています-スピナーのスクロールバーを常に表示したいです。ただし、スピナー機能については

setScrollbarFadingEnabled(false);

GUI の描画中に NullExceptionPointer でクラッシュします。

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)
4

6 に答える 6

9

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

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

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

ただし、Spinner の OnClickListener は登録できず、ショーの後に ListView のプロパティを設定します。

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

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

于 2012-09-28T17:17:49.973 に答える
0

「setScrollbarFadingEnabled」Java メソッドと「fadeScrollbar」xml メソッドの両方が、スピナーのリスト ビューがダイアログ (ポップアップ) にラップされているため、スピナーに影響を与えないことに気付きました。これらのプロパティはリストビューに到達しません。

しかし、実際にスピナーのリストビューに到達するのは THEME です。

したがって、次のようなカスタム テーマを作成するだけです。

<style name="App_SpinnerStyle" >
        <item name="android:fadeScrollbars">false</item>
</style>

そして、次のようにスピナーに追加します。

android:popupTheme="@style/App_SpinnerStyle"

試してみました!

于 2019-11-23T06:41:28.223 に答える
0

setScrollbarFadingEnabled(false);初期調査の結果、スピナーを呼び出すことはできないと考えています。

クラスの実装を読みましたSpinner.java(View.javaこの最後の実装setScrollbarFadingEnabled(boolean)は API16 の実装で、問題は次の行です:

cache.scrollBar.setAlpha(255);

おそらくcache.scrollBarこの時点で null であり、この属性の初期化を強制する方法が見つかりませんでした。

この属性を管理するほとんどのメソッドは保護されているかプライベートであるため、単に呼び出すことはできません。

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

于 2012-09-28T11:47:44.003 に答える