wake-up-neo.com

android Lollipop scrollview Randeffektfarbe

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. 

12
user3065901

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" />
38
alanv

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.

8
matiash

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.

4
grunk

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();
            }
        }
    }
}
2
wrkwrk

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.

1
Pedro Oliveira

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"/>
0
phoenix