不能使微调的滚动条总是可见的(安卓)(Can't make spinner's sc

2019-06-23 09:15发布

我有这样一个问题 - 我想使微调的滚动条始终可见。 但微调的功能

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)

Answer 1:

微调不具有滚动条,所以你得到的NullPointerException。

通过微调所示的弹出有一个滚动条。 所以,你需要更改微调显示ListView控件的属性。 但是ListView控件本身没有任何公共方法暴露的微调。

即使你通过反射得到ListPopupWindow,再出现问题,您单击微调后ListPopupWindow的ListView控件只被创建。

但微调的OnClickListener无法注册,演出结束后,设置ListView的属性。

您可以创建自定义微调与performClick重写,然后通过反射得到mPopup。 并使用mPopup.getListView().setScrollbarFadingEnabled(false)

但是,如果你要创建一个自定义的微调,我认为这是比较容易实现整个弹出来满足您的需求比使用反射。



Answer 2:

感谢@nandeesh为他/她的回答也@ 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 (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); }
}


Answer 3:

一个初步调查后,我在想,是不是可以调用setScrollbarFadingEnabled(false); 在微调。

我已阅读类的实现Spinner.javaView.java (最后一个实现setScrollbarFadingEnabled(boolean)的API16的,问题是线路:

cache.scrollBar.setAlpha(255);

也许cache.scrollBar在这一点空,我没有找到任何办法迫使这个属性的一些初始化。

谁管理这个属性的大部分方法都是受保护的或私有的,所以我们不能只给他们打电话。

我会继续为了找到一个可能的解决方案来研究这个问题,但现在,考虑到没有人回答这个问题呢,我在想这是不可能的。



文章来源: Can't make spinner's scrollbar always visible (Android)