2014-11-24 19 views
12

In meiner app ändern ich die Overscroll-Leuchteffekt Farbe wie folgt aus:android Lutscher Scrollrandeffekt Farbe

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 wenn ich diesen Code Abstürze aktualisiert Lutscher. Ich erhalte folgende 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) 

Es scheint, dass overscroll_glow Ressource in Lutscher fehlt. Wie kann ich dies in Lollipop erreichen?

Vielen Dank im Voraus.

+1

Im Allgemeinen sollten Sie nie versuchen, Framework-private Ressourcen wie diese zu verweisen. Sie können nicht garantiert werden, dass sie über Betriebssystemaktualisierungen oder sogar zwischen verschiedenen OEM-angepassten Versionen desselben Betriebssystems bestehen. – alanv

Antwort

35

Sie können in Ihrem Design android:colorEdgeEffect angeben, um die Farbe des Overscrolls in Ihrer gesamten App zu ändern. Standardmäßig erbt er den primären Farbwert, der durch android:colorPrimary festgelegt wurde.

res/Werte/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 unter Verwendung eines Inline-Thema Overlay ändern.

res/Werte/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" /> 
+0

Ich erhalte den folgenden Eror mit dieser Methode. Fehler: (6, 21) Es wurde keine Ressource gefunden, die dem angegebenen Namen entspricht: attr 'colorEdgeEffect'. – user1506630

+1

Entschuldigung, das hätte android sein sollen: colorEdgeEffect. – alanv

+1

@alanv Kennen Sie eine Möglichkeit, die Leuchtfarbe programmgesteuert zu ändern? In meiner App ändere ich die Statusleiste und die Symbolleistenfarbe programmabhängig je nach Kontext und würde auch die Overscrollglühfarbe ändern. Ich habe festgestellt, dass sich die neue Kontakte App in Lollipop je nach Kontakt ändert. – MrBrightside

1

overscroll_glow.png existiert nicht in Plattform 21. Sie können die Ressourcen von Plattform 20 kopieren und verwenden.

{SDK_FOLDER}\platforms\android-20\data\res

diese Weise können Sie Reflexion nicht verwenden, die können, wie Sie, Chaos mit Ihrem Programm nach einigen Updates sehen können:

Sie overscroll_glow.png in finden.

4

In den Überrolleffekt Farbe Lutscher mit dem Artikel Stil colorPrimary angepasst werden:

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

Dieses Produkt wird auch die Farbe der Symbolleiste beeinflussen.

7

Die "android:colorEdgeEffect" Lösung funktioniert perfekt, und ist viel besser als die bisherigen Hacks. Es kann jedoch nicht verwendet werden, wenn die Kantenfarbe prorgrammatisch geändert werden muss.

Es ist möglich, obwohl, Reflexion zu verwenden, dies zu tun, die EdgeEffect Objekte direkt in den AbsListView oder ScrollView Instanzen einstellen. 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.

Die gleichen Vorbehalte wie jede auf Reflexion basierende Lösung.

2

Ich verwende dies, um die Randfarbe programmgesteuert auf Android L zu ändern. Dies funktioniert für ListView und 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(); 
      } 
     } 
    } 
}