2011-06-02 9 views
13

मेरे एंड्रॉइड ऐप में Iter कोड में एक व्यू ऑन-क्लिक हैंडलर नहीं बनाता है, लेकिन इसे XML लेआउट फ़ाइल में निर्दिष्ट करने की क्षमता पर भरोसा करता है, जैसे इस:एंड्रॉइड प्रोगार्ड - कैसे चालू रखें एक्सएमएल लेआउट से संदर्भित हैंडलर पर क्लिक करें

public void onSearchClicked(View v) { 
    ........} 

मतलब अपने खुद के कोड में इस पद्धति के लिए कोई स्पष्ट संदर्भ है:

<Button 
     .... 
     android:onClick="onSearchClicked" 
     ...../> 

और फिर इस तरह की गतिविधि में विधि है।

उत्पादन उत्पादन के लिए प्रोगुआर्ड चलाते समय ऐसा लगता है कि यह विधि हटाने और ऑन-क्लिक विफल हो जाती है।

इससे बचने के लिए मैं अपने प्रोजेवार्ड कॉन्फ़िगरेशन फ़ाइल में क्या जोड़ सकता हूं जो मुझे इन सभी विधियों का नाम बदलने के लिए बाध्य नहीं करेगा?

  • एक एनोटेशन मैं विधि में जोड़ सकता हूं और प्रोजेगार्ड नोटिस ले सकता है?
  • किसी भी तरह xml से संदर्भित इन प्रकार के तरीकों को निर्दिष्ट करें?
  • मुझे लगता है कि मैं कोड में एक झूठा संदर्भ जोड़ सकता हूं, लेकिन अगर मैं ऐसा कर सकता हूं तो मैं इसे हमेशा याद रखना नहीं चाहूंगा!

मैंने एंड्रॉइड के लिए प्रोजेक्ट उदाहरणों को देखा है और इस विशेष आवश्यकता के लिए कुछ भी नहीं देख सकता है।

+0

फिर। बिल का सही जवाब नहीं है, और मैं अपने उत्तर के लिए वोट नहीं दे सकता हूं। –

उत्तर

22

यह सबसे अच्छा जवाब हो रहा है के रूप में यह इस तरह के तरीकों के नामकरण के लिए 100% मजबूत है:

# This will avoid all the onClick listeners referenced from XML Layouts from being removed 
-keepclassmembers class * extends android.app.Activity { 
     public void *(android.view.View); 
} 

यह आशा है कि मदद करता है.

+0

मैंने उपर्युक्त कोड जोड़ा लेकिन मुझे अभी भी 'java.lang.IllegalStateException मिल रहा है: गतिविधि की विधि निष्पादित नहीं कर सका' –

+1

क्या यह सार्वजनिक है और ऑनक्लिक हैंडलर के लिए आवश्यक विधि हस्ताक्षर से मेल खाता है? –

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। हां यह सार्वजनिक था लेकिन मुझे ऑनक्लिक नामक अन्य फ़ंक्शन से संबंधित समस्या मिली। इसलिए कोई चिंता नहीं। –

1
-keepclasseswithmembers class * { 
    public void onSearchClicked(android.view.View); 
} 

लेकिन डबल ProGuard दस्तावेज़ से यह जाँच: http://proguard.sourceforge.net/index.html#/manual/refcard.html

+0

मैंने इसके बारे में सोचा, लेकिन एक गतिविधि में मेरे पास इनमें से एक का हिस्सा हो सकता है, सभी अलग-अलग नामों के साथ। और मेरे कोड में किए गए किसी भी बदलाव के लिए मेरे प्रोग्रार्ड कॉन्फ़िगरेशन में बदलाव की आवश्यकता होगी .... मैं एक और अधिक मजबूत तरीके की तलाश में हूं। –

1

मैं का उपयोग करें:

-keepclassmembers class * extends android.app.Activity { 
     public void on*Click(android.view.View); 
} 

और फिर मैं नाम सभी onClick तरीकों की तरह: onCancelBtnClick(), onBackgroundClick(), आदि

संबंधित मुद्दे