2014-11-24 17 views
12

Trong ứng dụng của tôi thay đổi màu sắc hiệu ứng ánh sáng thanh cuộn như thế này:Android Lollipop scrollview hiệu lực cạnh màu

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

Nhưng khi tôi cập nhật để lollipop mã này bị treo. Tôi nhận được mã lỗi sau:

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) 

Dường như tài nguyên bị ghi đè quá thiếu trong kẹo. Làm thế nào tôi có thể đạt được điều này trong kẹo?

Xin cảm ơn trước.

+1

Nói chung, bạn không bao giờ nên cố gắng tham khảo các tài nguyên khung công tác như vậy. Chúng không được đảm bảo tồn tại trên các bản cập nhật hệ điều hành hoặc thậm chí giữa các phiên bản OEM tùy chỉnh khác nhau của cùng một hệ điều hành. – alanv

Trả lời

35

Bạn có thể chỉ định android:colorEdgeEffect trong chủ đề của mình để thay đổi màu phát sáng quá mức trong toàn bộ ứng dụng của bạn. Theo mặc định, điều này kế thừa giá trị màu chính được đặt bởi android:colorPrimary.

res/values ​​/ themes.xml:

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

Ngoài ra, bạn có thể sửa đổi giá trị này cho một cái nhìn duy nhất sử dụng một lớp phủ chủ đề inline.

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

Tôi nhận được eroor sau bằng cách sử dụng phương pháp đó. Lỗi: (6, 21) Không tìm thấy tài nguyên nào khớp với tên đã cho: attr 'colorEdgeEffect'. – user1506630

+1

Xin lỗi, đó phải là android: colorEdgeEffect. – alanv

+1

@alanv Bạn có biết cách thay đổi màu sáng lập trình không? Trong ứng dụng của tôi, tôi thay đổi thanh trạng thái và màu thanh công cụ theo chương trình tùy thuộc vào ngữ cảnh và sẽ thay đổi màu sắc ánh sáng rực rỡ quá mức. Tôi đã tìm thấy ứng dụng Danh sách liên hệ mới trong Lollipop thay đổi tùy thuộc vào liên hệ. – MrBrightside

1

overscroll_glow.png không tồn tại trong nền tảng 21. Bạn có thể sao chép tài nguyên từ nền tảng 20 và sử dụng chúng.

Bạn có thể tìm overscroll_glow.png trong:

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

Bằng cách này bạn không sử dụng phản ánh rằng có thể, như bạn thấy, gây rối với chương trình sau khi một số thông tin cập nhật.

4

Trong lollipop màu hiệu lực thanh cuộn có thể được tùy chỉnh với colorPrimary phong cách mục:

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

Mục này cũng ảnh hưởng đến màu sắc của thanh công cụ.

7

Giải pháp "android:colorEdgeEffect" hoạt động hoàn hảo, và là tốt hơn nhiều so với hacks trước. Tuy nhiên, nó không thể được sử dụng nếu màu cạnh cần được thay đổi theo chương trình.

Đó là thể, tuy nhiên, để sử dụng phản ánh để làm như vậy, thiết lập EdgeEffect đối tượng trực tiếp trong AbsListView hoặc ScrollView trường. Ví dụ:

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() đã được thêm vào Lollipop. Tuy nhiên,

Tương tự như bất kỳ giải pháp dựa trên phản chiếu nào.

2

Tôi đang sử dụng tính năng này để thay đổi màu cạnh theo lập trình trên Android L. Điều này phù hợp với cả listView và scrollView và các chế độ xem mở rộng chúng.

@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(); 
      } 
     } 
    } 
} 
Các vấn đề liên quan