android леденец scrollview края эффект цвет
в моем приложении я меняю цвет эффекта свечения overscroll следующим образом:
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 отсутствует в lollipop. Как я могу достичь этого в lollipop?
спасибо заранее.
5 ответов
вы можете указать android:colorEdgeEffect
в вашей теме, чтобы изменить цвет свечения overscroll в пределах всего приложения. По умолчанию это наследует значение основного цвета, заданное android:colorPrimary
.
res / значения / темы.XML-код:
<style name="MyAppTheme" parent="...">
...
<item name="android:colorEdgeEffect">@color/my_color</item>
</style>
кроме того, вы можете изменить это значение для одного представления с помощью встроенного наложения темы.
res / значения / темы.XML-код:
<!-- Note that there is no parent style or additional attributes specified. -->
<style name="MyEdgeOverlayTheme">
<item name="android:colorEdgeEffect">@color/my_color</item>
</style>
res / layout / my_layout.XML-код:
<ListView
...
android:theme="@style/MyEdgeOverlayTheme" />
на "android:colorEdgeEffect"
решение работает отлично и намного лучше, чем предыдущие хаки. Однако он не может быть использован, если цвет края необходимо изменить prorgrammatically.
это возможно, однако, чтобы использовать отражение для этого, установите 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.
такие же предостережения как любое отражени-основанное решение, хотя.
в lollipop цвет эффекта overscroll можно настроить с помощью элемента стиль colorPrimary:
<style name="MyApp" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/mycolor</item>
</style>
этот пункт также влияет на цвет панели инструментов.
Я использую это, чтобы программно изменить цвет края на 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();
}
}
}
}
overscroll_glow.png
не существует в платформе 21. Вы можете скопировать ресурсы из платформы 20 и использовать их.
Вы можете найти overscroll_glow.png
in:
{SDK_FOLDER}\платформы\android-20\data\res
таким образом, вы не используете отражение, которое, как вы можете видеть, может испортить вашу программу после некоторых обновлений.