web-dev-qa-db-fra.com

android Lollipop scrollview Couleur de l'effet de bord

Dans mon application, je change la couleur de l'effet de surbrillance comme suit:

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);

Mais quand j'ai mis à jour pour Lollipop ce code se bloque. Je reçois le code d'erreur suivant:

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)

Il semble que la ressource overscroll_glow soit manquante dans Lollipop. Comment puis-je atteindre cela dans sucette?

Merci d'avance. 

12
user3065901

Vous pouvez spécifier Android:colorEdgeEffect dans votre thème pour modifier la couleur de lueur de défilement excessif dans l'ensemble de votre application. Par défaut, cela hérite de la valeur de couleur primaire définie par Android:colorPrimary.

res/values ​​/ themes.xml:

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

Vous pouvez également modifier cette valeur pour une vue unique à l'aide d'une superposition de thème intégrée.

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/my_layout.xml:

<ListView
    ...
    Android:theme="@style/MyEdgeOverlayTheme" />
38
alanv

La solution "Android:colorEdgeEffect" fonctionne parfaitement et est bien meilleure que les précédents hacks. Cependant, il ne peut pas être utilisé si la couleur de la bordure doit être modifiée de manière pragmatique.

Il est possible , cependant, d'utiliser la réflexion pour le faire, définissant les objets EdgeEffect directement dans les instances AbsListView ou ScrollView. Par exemple:

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() a été ajouté à Lollipop.

Mêmes mises en garde que pour toute solution basée sur la réflexion.

8
matiash

Dans Lollipop, la couleur de l'effet de recouvrement peut être personnalisée avec le style de l'article colorPrimary:

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

Cet élément affecte également la couleur de la barre d’outils.

4
grunk

J'utilise ceci pour changer la couleur de bord par programmation sur Android L. Cela fonctionne à la fois pour listView et scrollView, et les vues les étendent.

@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 n'existe pas sur la plate-forme 21. Vous pouvez copier les ressources de la plate-forme 20 et les utiliser.

Vous pouvez trouver overscroll_glow.png dans:

{SDK_FOLDER}\plateformes\Android-20\data\res

De cette façon, vous n'utilisez pas de réflexion qui peut, comme vous pouvez le constater, endommager votre programme après certaines mises à jour.

1
Pedro Oliveira

je sais que je suis trop tard, mais cela fonctionne pour moi pour mon api app> = 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