In meiner App ändere ich die Farbe des Overscroll-Glow-Effekts folgendermaßen:
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);
Aber als ich auf Lollipop aktualisiert habe, stürzt dieser Code ab. Ich erhalte folgenden Fehlercode:
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)
Scheint, dass in Lollipop die Overscroll_glow-Ressource fehlt. Wie kann ich das im Lutscher erreichen?
Danke im Voraus.
Sie können in Ihrem Design Android:colorEdgeEffect
angeben, um die Leuchtfarbe für das Überschreiben in Ihrer gesamten App zu ändern. Standardmäßig erbt der durch Android:colorPrimary
festgelegte Primärfarbwert.
res/values / themes.xml:
<style name="MyAppTheme" parent="...">
...
<item name="Android:colorEdgeEffect">@color/my_color</item>
</style>
Alternativ können Sie diesen Wert für eine einzelne Ansicht mithilfe einer Inline-Design-Überlagerung ändern.
res/values / 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>
res/layout/mein_layout.xml:
<ListView
...
Android:theme="@style/MyEdgeOverlayTheme" />
Die "Android:colorEdgeEffect"
-Lösung funktioniert einwandfrei und ist viel besser als die vorherigen Hacks. Es kann jedoch nicht verwendet werden, wenn die Kantenfarbe prorgrammatisch geändert werden muss.
Es ist möglich , die Reflektion zu verwenden, indem die EdgeEffect
-Objekte direkt in den AbsListView
- oder ScrollView
-Instanzen gesetzt werden. Zum Beispiel:
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()
wurde in Lollipop hinzugefügt.
Gleiche Vorbehalte wie bei jeder reflexionsbasierten Lösung.
In Lollipop kann die Farbe des Overscroll-Effekts mit dem Elementstil colorPrimary angepasst werden:
<style name="MyApp" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/mycolor</item>
</style>
Dieses Element beeinflusst auch die Farbe der Symbolleiste.
Ich verwende dies, um die Kantenfarbe unter Android L programmatisch zu ändern. Dies funktioniert sowohl für ListView als auch für ScrollView, und Ansichten erweitern sie.
@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
ist in Plattform 21 nicht vorhanden. Sie können die Ressourcen von Plattform 20 kopieren und verwenden.
Sie finden overscroll_glow.png
in:
{SDK_FOLDER}\platform\Android-20\data\res
Auf diese Weise verwenden Sie keine Reflektion, die, wie Sie sehen, nach einigen Updates mit Ihrem Programm in Berührung kommen kann.
ich weiß, ich bin zu spät, aber das funktioniert für mich für meine App 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"/>