2012-04-04 51 views
4

我有这样的问题 - 我想让微调器的滚动条始终可见。 但微调的功能无法让微调器的滚动条始终可见(Android)

setScrollbarFadingEnabled(false); 

导致崩溃与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) 
+0

我们可以看到一些logcat的?谢谢。 – pablisco 2012-04-04 17:56:53

+0

这是否发生在所有api级别上? – nandeesh 2012-09-25 17:17:36

+0

@nandeesh我知道肯定会发生自API 15以来。不知道有关次要级别。 – 2012-09-26 16:42:14

回答

7

微调器没有滚动条,因此你得到NullPointerException。

微调器显示的弹出窗口有一个滚动条。所以你需要改变微调器显示的ListView的属性。但是ListView本身并没有被Spinner通过任何公共方法公开。

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

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

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

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

+0

好的,谢谢你的回答,我想它几乎是一样的。很伤心。 – Dmitry 2012-10-03 19:45:50

+3

+1谢谢。这是我的实现:http://stackoverflow.com/a/19820350/597657 – 2013-11-06 19:01:12

0

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

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

cache.scrollBar.setAlpha(255); 

大概cache.scrollBar为null,在这一点上,我没有找到任何办法迫使这个属性的一些初始化。

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

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

0

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