2014-11-24 8 views
12

मेरे ऐप में मैं इस तरह ओवरस्क्रॉल चमक प्रभाव रंग बदलने:एंड्रॉयड लॉलीपॉप scrollview बढ़त प्रभाव रंग

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

लेकिन जब मैं इस कोड दुर्घटनाओं Lollipop में अपडेट किया गया। मुझे निम्न त्रुटि कोड मिलता है:

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) 

लगता है कि overscroll_glow संसाधन लॉलीपॉप में गायब है। मैं इसे लॉलीपॉप में कैसे प्राप्त कर सकता हूं?

अग्रिम धन्यवाद।

+1

सामान्य रूप से, आपको फ्रेमवर्क-निजी संसाधनों को संदर्भित करने का प्रयास कभी नहीं करना चाहिए। उन्हें ओएस अपडेटों में या एक ही ओएस के विभिन्न OEM-अनुकूलित संस्करणों के बीच भी जारी रखने की गारंटी नहीं है। – alanv

उत्तर

35

आप अपने विषय में android:colorEdgeEffect निर्दिष्ट अपने पूरे अनुप्रयोग के भीतर ओवरस्क्रॉल चमक रंग बदलने के लिए कर सकते हैं। डिफ़ॉल्ट रूप से, यह प्राथमिक रंग मान android:colorPrimary द्वारा सेट किया जाता है।

res/values ​​/ themes.xml:

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

वैकल्पिक रूप से, आप एक इनलाइन विषय ओवरले का उपयोग कर एक दृश्य के लिए यह मान संशोधित कर सकते हैं।

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> 

रेस/लेआउट/my_layout.xml:

<ListView 
    ... 
    android:theme="@style/MyEdgeOverlayTheme" /> 
+0

मुझे उस विधि का उपयोग करके निम्नलिखित एरर मिलता है। त्रुटि: (6, 21) कोई संसाधन नहीं मिला जो दिए गए नाम से मेल खाता है: attr 'colorEdgeEffect'। – user1506630

+1

क्षमा करें, यह एंड्रॉइड होना चाहिए था: colorEdgeEffect। – alanv

+1

@alanv क्या आप चमकदार रंग को प्रोग्रामेटिक रूप से बदलने का तरीका जानते हैं? मेरे ऐप में मैं संदर्भ के आधार पर स्टेटस बार और टूलबार रंग प्रोग्रामेटिक रूप से बदलता हूं और overscroll चमक रंग भी अच्छा बदलता हूं। मैंने पाया है कि लॉलीपॉप में नया संपर्क ऐप संपर्क के आधार पर बदलता है। – MrBrightside

1

overscroll_glow.png प्लेटफ़ॉर्म 21 में मौजूद नहीं है। आप रिसोर्स को प्लेटफ़ॉर्म 20 से कॉपी कर सकते हैं और उनका उपयोग कर सकते हैं।

आप में overscroll_glow.png पा सकते हैं:

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

इस तरह आप प्रतिबिंब है कि कर सकते हैं का उपयोग नहीं करते, जैसा कि आप कुछ अपडेट के बाद देख सकते हैं, अपने कार्यक्रम के साथ गड़बड़।

4

में लॉलीपॉप ओवरस्क्रॉल प्रभाव रंग आइटम शैली colorPrimary साथ अनुकूलित किया जा सकता:

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

इस आइटम में भी उपकरण पट्टी का रंग प्रभावित करते हैं।

7

"android:colorEdgeEffect" समाधान पूरी तरह से काम करता है, और पिछले हैक्स तुलना में काफी बेहतर है। हालांकि, इसका उपयोग नहीं किया जा सकता है अगर किनारे रंग को prorgrammatically बदला जाना चाहिए।

यह प्रतिबिंब का उपयोग करने के ऐसा करने के लिए, AbsListView या ScrollView मामलों में सीधे EdgeEffect वस्तुओं की स्थापना संभव है, हालांकि,। उदाहरण के लिए:

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() लॉलीपॉप में जोड़ा गया था।

हालांकि किसी भी प्रतिबिंब-आधारित समाधान के रूप में समान चेतावनी।

2

मैं एंड्रॉइड एल पर प्रोग्रामेटिक रूप से एज रंग बदलने के लिए इसका उपयोग कर रहा हूं। यह दोनों सूची दृश्य और स्क्रॉल व्यू के लिए काम करता है, और विचार उन्हें बढ़ाते हैं।

@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(); 
      } 
     } 
    } 
} 
संबंधित मुद्दे