2011-10-25 13 views
31

मैं कठोर पक्ष पर एक छवि के साथ एक विजेट विकसित कर रहा हूं, जिसे सेटिंग स्क्रीन में से किसी एक में उपयोगकर्ता द्वारा चुना जा सकता है। छवि को छविView.setScaleType ("CENTER") के साथ उपयोगकर्ता से सेट किया जा सकता है। यह काम करता है। छवि के यूआरएल को वरीयताओं में यूआरएल के रूप में संग्रहीत किया जाता है, और बिटमैप के बेस 64 एन्कोडेड स्ट्रिंग के रूप में भी (कारण मैं छवि को छोटा करना चाहता हूं और उपयोगकर्ता इसे सेटिंग्स में घुमा सकता है)एंड्रॉइड रिमोट व्यू, विजेट के अंदर एक छवि दृश्य के स्केल टाइप को कैसे सेट करें?

विजेट में, मैं छवि लोड करता हूँ। यह ठीक काम करता है। यूआरआई और बिटमैप के साथ भी। ImageView का स्केल टाइप भी लेआउट में एक निश्चित मान पर सेट है, यह भी काम करता है।

लेकिन मैं प्रोग्राम्सैटिक रूप से विजेट में ImageView के स्केल टाइप को कैसे परिभाषित कर सकता हूं? क्योंकि मैं स्केल टाइप को मान पर सेट करना चाहता हूं, उपयोगकर्ता ने सेटिंग्स में चुना है। RemoteViews के साथ, हम imageView नहीं मिल सकता है ...

मैंने कोशिश की:


myRemoteViews.setString (R.id.myImage, "setScaleType", "केन्द्र");


लॉगफ़ाइल का कहना है: समारोह setScaleType imageView के लिए संभव नहीं है।

क्या कोई जानता है कि इस परिभाषा को AppWidget के अंदर कैसे बनाया जाए?

उत्तर

42

आप प्रोग्राम के छवि देखें के लिए पैमाने प्रकार सेट करने के लिए इस खंड का उपयोग कर सकते ..

imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 

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

+10

यह सामान्य 'छवि दृश्य' के लिए स्केल प्रकार सेट करने का तरीका है, लेकिन प्रश्नकर्ता 'रिमोट व्यू' में पूछ रहा था। –

8

आप ImageView के स्रोत कोड को देखो, तो आप देख सकते हैं setScaleType विधि में @android.view.RemotableViewMethod एनोटेशन की कमी है, इसलिए इसे RemoteViews इंटरफ़ेस के माध्यम से नहीं कहा जा सकता है।

इस सीमा के लिए एक कामकाज है, लेकिन यह सुंदर नहीं है: प्रत्येक स्केल टाइप के लिए एक अलग लेआउट एक्सएमएल परिभाषित करें, और RemoteViews बनाने से पहले उनके बीच चुनें। यदि आपका लेआउट जटिल है, या आपके पास इस वर्कअराउंड को लागू करने के लिए एक से अधिक दृश्य हैं, तो आप मुख्य लेआउट के अंदर विशेष ImageView लेआउट जोड़ने के लिए RemoteViews.addView का उपयोग करना चाहेंगे।

मैं अपने एप Showr में एपविड्ज के लिए इस वर्कअराउंड (addView के साथ) का उपयोग कर रहा हूं। इस विधि के साथ समस्या यह है कि स्टॉक लॉन्चर में एक बग है: यदि आप बदलते हैं तो एक नया RemoteViews बनाकर मौजूदा ऐपविजेट का स्केल प्रकार और addView पर कॉल करने के लिए ImageView लेआउट जोड़ने के लिए, यह हमेशा एहसास नहीं करता है लेआउट बदल गया है।

+0

यह सुनिश्चित नहीं है कि यह काम करेगा, लेकिन 'ImageView' को विस्तारित करने और एनोटेशन जोड़ने के बारे में क्या, तो आपकी कस्टम 'छवि दृश्य'' super.setScaleType (...) ' – pjco

+2

पर कॉल करेगी, आप अपनी कक्षाओं का उपयोग नहीं कर सकते एक 'रिमोट व्यू', केवल सिस्टम में बनाया गया है। –

+0

आह बहुत बुरा है, हालांकि जानकारी के लिए धन्यवाद – pjco

1

चूंकि हटाने के लिए setScaleType पर कॉल करने का कोई आसान तरीका नहीं है, इसलिए मेरे आसपास के काम के साथ मैं अपने लेआउट में तीन छवि दृश्य बना रहा था और फिर उन लोगों की दृश्यता बदल रहा था जिनके द्वारा चुने गए स्केल प्रकार नहीं हैं उपयोगकर्ता:

// first I declared a map to associate preference values with imageView ids 

    private static final HashMap<Integer,Integer> widgetImageViewIds; 

    static { 
     widgetImageViewIds = new HashMap<Integer, Integer>(); 
     widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_START, R.id.imageViewStart); 
     widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_CENTER, R.id.imageViewCenter); 
     widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_END, R.id.imageViewEnd); 
    } 

    ... 

    // then when I update my widget show/hide the widgets based on the preference 

    for (HashMap.Entry<Integer, Integer> entry : widgetImageViewIds.entrySet()) { 
     Integer imageViewAlignment = entry.getKey(); 
     Integer imageViewId = entry.getValue(); 
     views.setViewVisibility(imageViewId, imageViewAlignment.intValue() != imageAlignmentPreferenceValue ? View.GONE : View.VISIBLE); 
    } 
संबंधित मुद्दे