अपने ऐप्लिकेशन के विजेट पिकर को बेहतर बनाने के लिए, Android 15 और उसके बाद के वर्शन वाले डिवाइसों पर जनरेट की गई विजेट की झलक दिखाएं. साथ ही, Android 12 से Android 14 वाले डिवाइसों के लिए, स्केल की गई विजेट की झलक दिखाएं. इसके लिए, previewLayout एट्रिब्यूट की वैल्यू दें. इसके अलावा, इससे पहले के वर्शन के लिए previewImage एट्रिब्यूट की वैल्यू दें.
जनरेट की गई विजेट की झलक की मदद से, अपने विजेट के लिए डाइनैमिक और लोगों की दिलचस्पी के हिसाब से झलक बनाई जा सकती हैं. इससे यह सही तरीके से पता चलता है कि विजेट, किसी व्यक्ति की होम स्क्रीन पर कैसे दिखेंगे. Android 15 और इसके बाद के वर्शन के लिए, इन्हें पुश एपीआई के ज़रिए उपलब्ध कराया जाता है. इसका मतलब है कि आपका ऐप्लिकेशन, अपने लाइफ़साइकल के दौरान किसी भी समय झलक दिखा सकता है. इसके लिए, उसे विजेट होस्ट से साफ़ तौर पर अनुरोध पाने की ज़रूरत नहीं होती.
ज़्यादा जानकारी के लिए, YouTube पर लाइव अपडेट और विजेट की मदद से अपने ऐप्लिकेशन को बेहतर बनाएं लेख पढ़ें.
जनरेट की गई झलकें जोड़ना
Android 15 या इसके बाद के वर्शन वाले डिवाइस पर, जनरेट की गई विजेट की झलक दिखाने के लिए, सबसे पहले मॉड्यूल build.gradle फ़ाइल में compileSdk की वैल्यू 35 या इसके बाद के वर्शन पर सेट करें. इससे विजेट पिकर को RemoteViews देने की सुविधा मिलेगी
ऐप्लिकेशन, AppWidgetManager में setWidgetPreview का इस्तेमाल कर सकते हैं. सिस्टम के गलत इस्तेमाल को रोकने और सिस्टम की परफ़ॉर्मेंस को बेहतर बनाने के लिए, setWidgetPreview एक ऐसा एपीआई है जिस पर अनुरोध करने की सीमा लागू होती है.
डिफ़ॉल्ट सीमा, हर घंटे में करीब दो कॉल है.
झलक दिखाने के लिए, सिस्टम से कोई कॉलबैक नहीं होता. इसलिए, आपके ऐप्लिकेशन को यह तय करना होगा कि setWidgetPreviews का इस्तेमाल कब करना है. अपडेट करने की रणनीति, आपके विजेट के इस्तेमाल के उदाहरण पर निर्भर करती है:
- अगर विजेट में स्थायी जानकारी है या वह झटपट कार्रवाई करने वाला विजेट है, तो ऐप्लिकेशन को पहली बार लॉन्च करने पर, विजेट की झलक सेट करें.
- ऐप्लिकेशन में डेटा मौजूद होने पर, झलक सेट की जा सकती है. उदाहरण के लिए, उपयोगकर्ता के साइन इन करने या शुरुआती सेटअप के बाद.
- चुनी गई कैडेंस के हिसाब से झलकियां अपडेट करने के लिए, बार-बार होने वाला टास्क सेट अप किया जा सकता है.
यहां दिए गए उदाहरण में, एक्सएमएल विजेट लेआउट रिसॉर्स लोड किया जाता है और उसे झलक के तौर पर सेट किया जाता है. इस स्निपेट में setWidgetPreview को एक तरीके के तौर पर दिखाने के लिए, compileSdk की बिल्ड सेटिंग 35 या उसके बाद की होनी चाहिए.
AppWidgetManager.getInstance(appContext).setWidgetPreview(
ComponentName(
appContext,
ExampleAppWidgetReceiver::class.java
),
AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
RemoteViews("com.example", R.layout.widget_preview)
)
स्केल किए जा सकने वाले विजेट की झलक जोड़ना
Android 12 से, विजेट पिकर में दिखने वाली विजेट की झलक को बड़ा या छोटा किया जा सकता है. इसे एक्सएमएल लेआउट के तौर पर उपलब्ध कराया जाता है. यह विजेट के डिफ़ॉल्ट साइज़ पर सेट होता है. इससे पहले, विजेट की झलक ड्रॉ करने लायक एक स्थायी संसाधन थी. कुछ मामलों में, झलक में यह सही तरीके से नहीं दिखता था कि विजेट को होम स्क्रीन पर जोड़ने के बाद वे कैसे दिखते हैं.
स्केल किए जा सकने वाले विजेट की झलक दिखाने के लिए, appwidget-provider एलिमेंट के previewLayout एट्रिब्यूट का इस्तेमाल करके, एक्सएमएल लेआउट उपलब्ध कराएं:
<appwidget-provider
android:previewLayout="@layout/my_widget_preview">
</appwidget-provider>
हमारा सुझाव है कि आप उसी लेआउट का इस्तेमाल करें जो असल विजेट में इस्तेमाल किया गया है. साथ ही, डिफ़ॉल्ट या टेस्ट वैल्यू को असल वैल्यू के हिसाब से रखें. ज़्यादातर ऐप्लिकेशन, एक ही previewLayout और initialLayout का इस्तेमाल करते हैं. सटीक झलक वाले लेआउट बनाने के बारे में जानकारी पाने के लिए, डाइनैमिक आइटम शामिल करके सटीक झलक बनाना लेख पढ़ें.
हमारा सुझाव है कि आप previewLayout और previewImage, दोनों एट्रिब्यूट की वैल्यू दें. इससे, अगर उपयोगकर्ता के डिवाइस पर previewLayout काम नहीं करता है, तो आपका ऐप्लिकेशन previewImage का इस्तेमाल कर सकेगा. previewLayout एट्रिब्यूट को previewImage एट्रिब्यूट के ऊपर प्राथमिकता दी जाती है.
पुराने सिस्टम के साथ काम करने की सुविधा के लिए, स्टैटिक विजेट की झलक दिखाने वाली इमेज जोड़ी गईं
Android 11 (एपीआई लेवल 30) या इससे पहले के वर्शन पर, विजेट पिकर को अपने विजेट की झलक दिखाने की अनुमति देने और स्केल की जा सकने वाली झलक के फ़ॉलबैक के तौर पर भी इस एट्रिब्यूट का इस्तेमाल किया जा सकता है. इसके लिए, previewImage एट्रिब्यूट की वैल्यू दें.
विजेट के दिखने के तरीके में बदलाव करने पर, झलक वाली इमेज को अपडेट करें.
अगर आपने setWidgetPreview का इस्तेमाल करके कोई इमेज सेट नहीं की है, तो इस एट्रिब्यूट का इस्तेमाल, जनरेट की गई झलक के लिए फ़ॉलबैक के तौर पर भी किया जाता है.
डाइनैमिक आइटम शामिल करके, सटीक झलक बनाना
इस सेक्शन में, कलेक्शन व्यू वाले विजेट के लिए, विजेट की झलक में एक से ज़्यादा आइटम दिखाने का सुझाव दिया गया है. कलेक्शन व्यू वाले विजेट का मतलब है कि वह विजेट, ListView, GridView या StackView का इस्तेमाल करता है. यह सुविधा, जनरेट की गई झलक पर नहीं, बल्कि स्केल किए जा सकने वाले विजेट की झलक पर लागू होती है.
अगर आपका विजेट इनमें से किसी एक व्यू का इस्तेमाल करता है, तो previewLayout में सीधे तौर पर विजेट का असल लेआउट देकर, स्केल की जा सकने वाली झलक बनाने से, विजेट की झलक में कोई आइटम न दिखने पर, अनुभव खराब हो सकता है. ऐसा इसलिए होता है, क्योंकि कलेक्शन व्यू डेटा को रनटाइम में डाइनैमिक तौर पर सेट किया जाता है. यह पहली इमेज में दिखाई गई इमेज जैसा दिखता है.
हमारा सुझाव है कि विजेट पिकर में, कलेक्शन व्यू वाले विजेट की झलकियां सही तरीके से दिखाने के लिए, सिर्फ़ झलक के लिए तय की गई एक अलग लेआउट फ़ाइल बनाए रखें. इस अलग लेआउट फ़ाइल में यह जानकारी शामिल होनी चाहिए:
- विजेट का असल लेआउट.
- फ़र्ज़ी आइटम के साथ प्लेसहोल्डर कलेक्शन व्यू. उदाहरण के लिए, कई फ़र्ज़ी लिस्ट आइटम के साथ प्लेसहोल्डर
LinearLayoutदेकर,ListViewकी नकल की जा सकती है.
ListView के उदाहरण को दिखाने के लिए, अलग लेआउट फ़ाइल से शुरू करें:
// res/layout/widget_preview.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/widget_background"
android:orientation="vertical">
// Include the actual widget layout that contains ListView.
<include
layout="@layout/widget_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
// The number of fake items you include depends on the values you provide
// for minHeight or targetCellHeight in the AppWidgetProviderInfo
// definition.
<TextView android:text="@string/fake_item1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="?attr/appWidgetInternalPadding" />
<TextView android:text="@string/fake_item2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="?attr/appWidgetInternalPadding" />
</LinearLayout>
AppWidgetProviderInfo मेटाडेटा का previewLayout एट्रिब्यूट देते समय, झलक दिखाने के लिए लेआउट फ़ाइल तय करें. आपको अब भी initialLayout एट्रिब्यूट के लिए, विजेट का असल लेआउट तय करना होगा. साथ ही, रनटाइम के दौरान RemoteViews बनाते समय, विजेट के असल लेआउट का इस्तेमाल करना होगा.
<appwidget-provider
previewLayout="@layout/widget_preview"
initialLayout="@layout/widget_view" />
सूची में शामिल कॉम्प्लेक्स आइटम
पिछले सेक्शन में दिए गए उदाहरण में, सूची में मौजूद आइटम फ़र्ज़ी हैं. ऐसा इसलिए है, क्योंकि सूची में मौजूद आइटम TextView ऑब्जेक्ट हैं. अगर आइटम के लेआउट कॉम्प्लेक्स हैं, तो फ़र्ज़ी आइटम उपलब्ध कराना ज़्यादा मुश्किल हो सकता है.
मान लें कि सूची का कोई आइटम widget_list_item.xml में तय किया गया है और इसमें दो TextView ऑब्जेक्ट शामिल हैं:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:id="@id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/fake_title" />
<TextView android:id="@id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/fake_content" />
</LinearLayout>
फ़र्ज़ी लिस्ट आइटम देने के लिए, लेआउट को कई बार शामिल किया जा सकता है. हालांकि, इससे हर लिस्ट आइटम एक जैसा हो जाता है. सूची में शामिल आइटम के लिए यूनीक आईडी देने के लिए, यह तरीका अपनाएं:
टेक्स्ट वैल्यू के लिए एट्रिब्यूट का सेट बनाएं:
<resources> <attr name="widgetTitle" format="string" /> <attr name="widgetContent" format="string" /> </resources>टेक्स्ट सेट करने के लिए, इन एट्रिब्यूट का इस्तेमाल करें:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="?widgetTitle" /> <TextView android:id="@id/content" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="?widgetContent" /> </LinearLayout>झलक के लिए, ज़रूरत के हिसाब से कई स्टाइल बनाएं. हर स्टाइल में वैल्यू फिर से तय करें:
<resources> <style name="Theme.Widget.ListItem"> <item name="widgetTitle"></item> <item name="widgetContent"></item> </style> <style name="Theme.Widget.ListItem.Preview1"> <item name="widgetTitle">Fake Title 1</item> <item name="widgetContent">Fake content 1</item> </style> <style name="Theme.Widget.ListItem.Preview2"> <item name="widgetTitle">Fake title 2</item> <item name="widgetContent">Fake content 2</item> </style> </resources>झलक वाले लेआउट में मौजूद फ़र्ज़ी आइटम पर स्टाइल लागू करें:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" ...> <include layout="@layout/widget_view" ... /> <include layout="@layout/widget_list_item" android:theme="@style/Theme.Widget.ListItem.Preview1" /> <include layout="@layout/widget_list_item" android:theme="@style/Theme.Widget.ListItem.Preview2" /> </LinearLayout>