以编程方式更改ScrollView的颜色

时间:2014-02-16 03:16:55

标签: android android-xml android-scrollview

我正在做什么

目前,我已使用android:scrollbarThumbVertical属性更改了我的XML文件中的滚动条,如下所示:

<ScrollView
    android:id="@+id/scrollView1"
    android:scrollbarThumbVertical="@drawable/scrollbar_blue"
    ... >

scrollbar_blue引用我的scrollbar_blue.xml文件,即:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <gradient
        android:angle="45"
        android:centerColor="@color/blue"
        android:endColor="@color/blue"
        android:startColor="@color/blue" />

    <corners android:radius="8dp" />
</shape>

我想做什么

我的应用程序有颜色选项 - 所以当颜色打开时,它应该保持蓝色;否则,它应该是灰色的。

如何以编程方式(在我的活动类中)更改我的ScrollView以使用我的scrollbar_grey.xml

如果您查看ScrollView上的Android文档,则android:scrollbarThumbVertical没有相应的方法

我也可以用另一种方式改变颜色。

以下是我创建ScrollView引用的方法:

ScrollView scr = (ScrollView)findViewById(R.id.scrollView1);

2 个答案:

答案 0 :(得分:26)

有一种方法可以通过编程方式更改它,但该方法不会公开。似乎没有任何其他东西可以从我读过的内容中以编程方式进行更改。

但是,我确实遇到过一个使用反射来执行此操作的stackoverflow应答。 如果它适合您,请在那里提出答案:https://stackoverflow.com/a/19819843/3286163

答案是针对列表视图,但对于scrollview来说是相同的:

ScrollView scr = (ScrollView)findViewById(R.id.scrollView1);
try
{
    Field mScrollCacheField = View.class.getDeclaredField("mScrollCache");
    mScrollCacheField.setAccessible(true);
    Object mScrollCache = mScrollCacheField.get(scr); // scr is your Scroll View

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

    // Set your drawable here.
    method.invoke(scrollBar, getResources().getDrawable(R.drawable.scrollbar_blue));
}
catch(Exception e)
{
    e.printStackTrace();
}

我唯一能找到的东西。我自己尝试了一下,但它确实有效。

答案 1 :(得分:0)

现在很容易:)

scrollView.verticalScrollbarThumbDrawable = ColorDrawable(Color.CYAN)
scrollView.horizontalScrollbarThumbDrawable = ColorDrawable(Color.WHITE)