【问题标题】:How to set scrollbar thumb programmatically in Android?如何在 Android 中以编程方式设置滚动条拇指?
【发布时间】:2022-02-20 05:22:27
【问题描述】:

我知道 listview 可以像这样Android:scrollbarThumbVertical 等在 XML 中设置滚动条缩略图。

但我在 java 代码中创建了一个 listview 实例,我可能需要设置不同的滚动条拇指。有没有一种方法可以通过编程设置滚动条拇指?

【问题讨论】:

    标签: android scrollbar


    【解决方案1】:

    您可以通过反射来实现:

    try
    {
        Field mScrollCacheField = View.class.getDeclaredField("mScrollCache");
        mScrollCacheField.setAccessible(true);
        Object mScrollCache = mScrollCacheField.get(listview);
        Field scrollBarField = mScrollCache.getClass().getDeclaredField("scrollBar");
        scrollBarField.setAccessible(true);
        Object scrollBar = scrollBarField.get(mScrollCache);
        Method method = scrollBar.getClass().getDeclaredMethod("setVerticalThumbDrawable", Drawable.class);
        method.setAccessible(true);
        method.invoke(scrollBar, getResources().getDrawable(R.drawable.scrollbar_style));
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    

    以上代码执行为:

    listview.mScrollCache.scrollBar.setVerticalThumbDrawable(getResources().getDrawable(R.drawable.scrollbar_style));
    

    【讨论】:

    • 嗨,@Eng.Fouad 上面的解决方案在 recyclerview 中不起作用..甚至 /*listview.mScrollCache.scrollBar.setVerticalThumbDrawable(getResources().getDrawable(R.drawable.scrollbar_style))*/ 这个行不适用于 listview 或 recyclerview。
    • 在 API 29 上触发错误:java.lang.NoSuchMethodException: android.widget.ScrollBarDrawable.setVerticalThumbDrawable [class android.graphics.drawable.Drawable]
    • 对于 API 29,我们可以调用 setVerticalScrollbarThumbDrawable(drawable)
    【解决方案2】:

    我修改了答案,使其成为 100% 以编程方式实现的方法

       public static void ChangeColorScrollBar(View Scroll, int Color, Context cxt){
    
       try
       {
           Field mScrollCacheField = View.class.getDeclaredField("mScrollCache");
           mScrollCacheField.setAccessible(true);
           Object mScrollCache = mScrollCacheField.get(Scroll);
           Field scrollBarField = mScrollCache.getClass().getDeclaredField("scrollBar");
           scrollBarField.setAccessible(true);
           Object scrollBar = scrollBarField.get(mScrollCache);
           Method method = scrollBar.getClass().getDeclaredMethod("setVerticalThumbDrawable", Drawable.class);
           method.setAccessible(true);
    
           Drawable[] layers = new Drawable[1];
           ShapeDrawable sd1 = new ShapeDrawable(new RectShape());
           sd1.getPaint().setColor(cxt.getResources().getColor(Color));
           sd1.setIntrinsicWidth(Math.round(cxt.getResources().getDimension(R.dimen.dp_3)));
           layers[0] = sd1;
    
           method.invoke(scrollBar, layers);
       }
       catch(Exception e)
       {
           e.printStackTrace();
       }
    

    }

    【讨论】:

      【解决方案3】:

      我不知道这个问题的答案,但经过一番挖掘后,我认为这不可能没有很多麻烦。

      这个 xml 属性实际上与 View 相关联,而不是 ListView - 在 Android View 源代码中,设置垂直拇指可绘制对象的唯一位置似乎是 'initializeScrollbars' 方法。现在这个方法不是私有的,所以我们可以扩展 View 的任何子节点并覆盖这个方法,但问题是设置拇指可绘制对象所需的关键组件 ScrollabilityCache 是私有的,没有任何 getter 方法。

      因此,如果不重写大量代码,我认为没有任何简单的方法可以做到这一点 - 抱歉!

      【讨论】:

        【解决方案4】:

        从 Android Q(API 级别 29)开始,您可以使用setVerticalScrollbarThumbDrawable() & setHorizontalScrollbarThumbDrawable()

        scrollView.verticalScrollbarThumbDrawable = 
                               ResourcesCompat.getDrawable(resources,     
                               R.drawable.scrollview_thumb, null)
        

        【讨论】:

          猜你喜欢
          • 2013-08-24
          • 2023-03-28
          • 1970-01-01
          • 2013-08-10
          • 2011-01-15
          • 2015-10-05
          • 1970-01-01
          • 1970-01-01
          • 2012-02-13
          相关资源
          最近更新 更多