Подтвердить что ты не робот

Как добавить цветовой эффект края прокрутки в Android Lollipop?

В моем приложении я изменяю цвет свечения прокрутки следующим образом:

int glowDrawableId = contexto.getResources().getIdentifier("overscroll_glow", "drawable", "android");
Drawable androidGlow = contexto.getResources().getDrawable(glowDrawableId);
assert androidGlow != null;
androidGlow.setColorFilter(getResources().getColor(R.color.MyColor), PorterDuff.Mode.SRC_ATOP);

Но когда я обновился до lollipop, этот код вылетает. Я получаю следующий код ошибки:

FATAL EXCEPTION: main
Process: com.myproject.myapp, PID: 954
android.content.res.Resources$NotFoundException: Resource ID #0x0
at android.content.res.Resources.getValue(Resources.java:1233)
at android.content.res.Resources.getDrawable(Resources.java:756)
at android.content.res.Resources.getDrawable(Resources.java:724)

Похоже, что в леденце на палочке отсутствует ресурс overscroll_glow.

Как мне этого добиться?

4b9b3361

Ответ 1

Вы можете указать android:colorEdgeEffect в своей теме, чтобы изменить цвет свечения прокрутки в пределах всего вашего приложения. По умолчанию это наследует основное значение цвета, заданное android:colorPrimary.

RES/значения/themes.xml:

<style name="MyAppTheme" parent="...">
    ...
    <item name="android:colorEdgeEffect">@color/my_color</item>
</style>

В качестве альтернативы вы можете изменить это значение для одного представления с помощью встроенного наложения темы.

RES/значения/themes.xml:

<!-- Note that there is no parent style or additional attributes specified. -->
<style name="MyEdgeOverlayTheme">
    <item name="android:colorEdgeEffect">@color/my_color</item>
</style>

Рез/макет/my_layout.xml:

<ListView
    ...
    android:theme="@style/MyEdgeOverlayTheme" />

Ответ 2

Решение "android:colorEdgeEffect" работает отлично и намного лучше, чем предыдущие хаки. Однако его нельзя использовать, если цвет края необходимо изменить программически.

Можно, однако, использовать отражение для этого, устанавливая объекты EdgeEffect непосредственно в экземплярах AbsListView или ScrollView. Например:

EdgeEffect edgeEffectTop = new EdgeEffect(this);
edgeEffectTop.setColor(Color.RED);

EdgeEffect edgeEffectBottom = new EdgeEffect(this);
edgeEffectBottom.setColor(Color.RED);

try {
    Field f1 = AbsListView.class.getDeclaredField("mEdgeGlowTop");
    f1.setAccessible(true);
    f1.set(listView, edgeEffectTop);

    Field f2 = AbsListView.class.getDeclaredField("mEdgeGlowBottom");
    f2.setAccessible(true);
    f2.set(listView, edgeEffectBottom);
} catch (Exception e) {
    e.printStackTrace();
}

EdgeEffect.setColor() был добавлен в Lollipop.

Те же предостережения, что и любое решение на основе отражения.

Ответ 3

В леденец цвет эффекта overscroll можно настроить с помощью цвета стиля элементаPrimary:

<style name="MyApp" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/mycolor</item>
</style>

Этот элемент также влияет на цвет панели инструментов.

Ответ 4

Я использую это, чтобы изменить цвет края программно на android L. Это работает как для listView, так и для scrollView, а виды расширяют их.

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static void setEdgeEffectL(View scrollableView, int color) {
    final String[] edgeGlows = {"mEdgeGlowTop", "mEdgeGlowBottom", "mEdgeGlowLeft", "mEdgeGlowRight"};
    for (String edgeGlow : edgeGlows) {
        Class<?> clazz = scrollableView.getClass();
        while (clazz != null) {
            try {
                final Field edgeGlowField = clazz.getDeclaredField(edgeGlow);
                edgeGlowField.setAccessible(true);
                final EdgeEffect edgeEffect = (EdgeEffect) edgeGlowField.get(scrollableView);
                edgeEffect.setColor(color);
                break;
            } catch (Exception e) {
                clazz = clazz.getSuperclass();
            }
        }
    }
}

Ответ 5

overscroll_glow.png не существует на платформе 21. Вы можете скопировать ресурсы с платформы 20 и использовать их.

Вы можете найти overscroll_glow.png в:

{SDK_FOLDER}\\ платформы андроид-20\Data\Рез

Таким образом, вы не используете отражение, которое, как видите, может быть запущено с вашей программой после некоторых обновлений.

Ответ 6

я знаю, что опоздал, но это работает для меня для моего приложения api> = 17:

<style name="ListTheme" parent="Theme.AppCompat.Light.DarkActionBar">
      <item name="colorPrimary">@color/colorPrimaryDark</item>
</style>

<ListView   
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ListTheme"/>