Android ListView fastScrollThumbDrawable не работает
Я делаю приложение, в котором я хочу, чтобы вкладка быстрой прокрутки в моем списке была настраиваемой вкладкой большого пальца. читая документы онлайн я думал, что это сделает это:
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:drawSelectorOnTop="false"
android:cacheColorHint="@color/myWhite"
android:scrollbars="vertical"
android:scrollbarThumbVertical="@drawable/scrollthumb"
android:scrollbarSize="12dip"
android:fastScrollThumbDrawable="@drawable/scrollbar_thumb"
android:fastScrollEnabled="true"
/>
Список в порядке, пользовательские цвета полосы прокрутки работают, и отображается вкладка панели прокрутки, но используется изображение большого пальца по умолчанию, а не файл png scrollbar_thumb.
изображение большого пальца должно быть в определенном формате или размере? можно ли изменить его на пользовательский рисунок, если нет, то по крайней мере можно изменить цвет большого пальца?
Любая помощь будет высоко ценится
5 ответов
В определении XML ListView добавьте
android:fastScrollEnabled="true"
или в коде
listView.setFastScrollEnabled(true);
Создайте файл fastscroll_thumb.xml в папке res/drawable следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/fastscroll_pressed" />
<item android:drawable="@drawable/fastscroll" />
</selector>
В AndroidManifest.xml установите собственную тему для своего приложения:
<application
android:theme="@style/ApplicationTheme"
...>
Создайте папку значений в папке res. Создайте файлы themes.xml в res/values следующим образом:
<resources>
<style name="ApplicationTheme">
<item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb</item>
</style>
</resources>
Наконец, убедитесь, что fastscroll.png и fastscroll_pressed.png существуют в вашей папке для рисования
Я использую android:fastScrollThumbDrawable
но я не знаю, почему это не работает, поэтому при поиске в Интернете я нашел здесь решение с жестким кодом, я не знаю, работает ли оно на старом API, но в моем случае проблема была решена. Обратите внимание, что я использую API 18 как цель и устройство с API 17 для тестирования.
код:
try {
Field f = AbsListView.class.getDeclaredField("mFastScroller");
f.setAccessible(true);
Object o = f.get(<<your listView here>>);
f = f.getType().getDeclaredField("mThumbDrawable");
f.setAccessible(true);
Drawable drawable = (Drawable) f.get(o);
drawable = getResources().getDrawable(R.drawable.<<your thumb drawable here can be a selector>>);
f.set(o, drawable);
} catch (Exception e) {
e.printStackTrace();
}
Я проверил предыдущие ответы и придумал эту упрощенную версию с минимальными требованиями для пользовательского значка большого пальца для быстрой прокрутки:
Манифест Android: (тег приложения)
android:theme="@style/ApplicationTheme"
Рез / значения / themes.xml:
<resources>
<style name="ApplicationTheme">
<item name="android:fastScrollThumbDrawable">@drawable/scrollbar</item>
</style>
</resources>
layout \ activity_main.xml: (или там, где, по вашему мнению, вы хотите применить это и включить быструю прокрутку), ДОБАВЬТЕ следующее:
<ListView android:fastScrollEnabled="true" />
Для того, чтобы изменить fastScrollThumbDrawable
, fastScrollTrackDrawable
или цвет текста быстрой прокрутки SectionIndexer
Вы должны использовать тему контекста. Другие ответы рекомендуют переопределить тему приложения через AndroidManifest
сделать это. Это работает, но если вы хотите, чтобы в зависимости от ListView
ты не можешь сделать это. Кроме того, как вы меняете цвет текста на SectionIndexer
не должно быть сделано в вашей теме приложения, потому что это может иметь другие нежелательные эффекты.
Лучший способ стилизовать ListView
для быстрого прокрутки это создать кастом ListView
который использует ContextThemeWrapper
,
Вот пример:
public class FastscrollThemedListView extends ListView {
public FastscrollThemedListView(Context context, AttributeSet attrs) {
super(new ContextThemeWrapper(context, R.style.FastScrollTheme), attrs);
}
}
Это все, что вам нужно. Ваш стиль будет выглядеть так:
<style name="FastScrollTheme">
<item name="android:textColorPrimary">?android:textColorPrimaryInverse</item>
<item name="android:fastScrollThumbDrawable">@drawable/fast_scrollbar_thumb</item>
<item name="android:fastScrollTrackDrawable">@drawable/fast_scrollbar_track</item>
</style>
textColorPrimary
как вы цепляетесь, как вы цепляетесь в SectionIndexer
цвет шрифта, если вы используете его.
Ваш ListView будет выглядеть так:
<com.yourapp.view.FastscrollThemedListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:drawSelectorOnTop="false"
android:cacheColorHint="@color/myWhite"
android:scrollbars="vertical"
android:scrollbarSize="12dip"
android:fastScrollEnabled="true"/>
Обратите внимание, что android:fastScrollThumbDrawable
Атрибут применяется только для Android API уровня 11 и выше.