How to handle the fast-scroller on Lollipop 5.1?

僤鯓⒐⒋嵵緔 提交于 2019-12-03 01:41:18

I had the same problem and after a few hours of research I came up with a solution. This AOSP commit helped me the most, it shows the changes made to the scrollbar in Android 5.1 (SDK 22): Update scrollbars to match Material spec

There are two possibilities:

A: Use the new style and add padding

This will keep the same new rectangle from API 21 (Android 5.1), but add some padding left and right.

1: Copy the fastscroll_thumb_material.xml to your drawables folder

This should be the content (removed AOSP comments to save space):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:tint="?attr/colorControlActivated"
            android:shape="rectangle">
            <solid android:color="@android:color/white" />
            <size android:width="8dp" android:height="48dp" />
        </shape>
    </item>
    <item>
        <shape android:tint="?attr/colorControlNormal"
            android:shape="rectangle">
            <solid android:color="@android:color/white" />
            <size android:width="8dp" android:height="48dp" />
        </shape>
    </item>
</selector>

2: Edit your theme

Add the following item to your theme. I think you could put this in a style and use it with setFastScrollStyle, but I find this easier.

<item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb_material</item>

3: Edit fastscroll_thumb_material.xml

You can edit it to your liking, but I did the following, which adds 8dp to the left and right of the scrollbar. I added a layer-list and item around each shape and added android:right="8dp" and android:left="8dp" to the new item. I tried adding that to the original items, but that didn't work, neither did adding padding to the shape.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <layer-list>
            <item android:right="8dp" android:left="8dp">
                <shape android:tint="?attr/colorControlActivated"
                    android:shape="rectangle">
                    <solid android:color="@android:color/white" />
                    <size android:width="8dp" android:height="48dp" />
                </shape>
            </item>
        </layer-list>
    </item>
    <item>
        <layer-list>
            <item android:right="8dp" android:left="8dp">
                <shape android:tint="?attr/colorControlNormal"
                    android:shape="rectangle">
                    <solid android:color="@android:color/white" />
                    <size android:width="8dp" android:height="48dp" />
                </shape>
            </item>
        </layer-list>
    </item>
</selector>

B: Change the scrollbar to the old style

This will use the API 21, Android 5.0 style

1: Add the old drawables to your project

You can download them from the commit above (fastscroll_thumb_mtrl_alpha.png and fastscroll_track_mtrl_alpha.9.png), but I also bundled them, you can also download them from my Google Drive.

2: Add fastscroll_thumb_material.xml to your drawables

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <bitmap android:src="@drawable/fastscroll_thumb_mtrl_alpha"
            android:tint="?attr/colorControlActivated" />
    </item>
    <item>
        <bitmap android:src="@drawable/fastscroll_thumb_mtrl_alpha"
            android:tint="?attr/colorControlNormal" />
    </item>
</selector>

3: Add fastscroll_track_material.xml to your drawables

<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/fastscroll_track_mtrl_alpha"
    android:tint="?attr/colorControlNormal" />

4: Edit your theme

Add the following item to your theme. I think you could put this in a style and use it with setFastScrollStyle, but I find this easier.

<item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb_material</item>
<item name="android:fastScrollTrackDrawable">@drawable/fastscroll_track_material</item>

I hope this helps to achieve your goal :)

Why not set padding on the right side of your layout containing the ListView? Google webpage @ setPadding(). Personally I used android:paddingLeft for a similar issue like yours.

Another common trick is to add a (hidden) ImageView in the layout on the right side (horizontal orientation). The ImageView would be hidden and the (width) size can be set.

Glad to help a frequent SO user, hope I did. Regards, Tommy Kwee.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!