अपने विजेट को बेहतर बनाएं

Compose को आज़माएं
Jetpack Compose, Android के लिए यूज़र इंटरफ़ेस (यूआई) का सुझाया गया टूलकिट है. Compose-स्टाइल वाले एपीआई का इस्तेमाल करके, विजेट बनाने का तरीका जानें.

इस पेज पर, विजेट को बेहतर बनाने के उन विकल्पों के बारे में जानकारी दी गई है जो Android 12 (एपीआई लेवल 31) से उपलब्ध हैं. ये सुविधाएं ज़रूरी नहीं हैं. हालांकि, इन्हें लागू करना आसान है. साथ ही, इनसे लोगों को विजेट का बेहतर अनुभव मिलता है.

विजेट को बेहतर बनाने के अन्य तरीकों के बारे में जानने के लिए, Compose की गाइड अपने विजेट को बेहतर बनाना लेख पढ़ें.

डाइनैमिक रंगों का इस्तेमाल करना

Android 12 से, कोई विजेट बटन, बैकग्राउंड, और अन्य कॉम्पोनेंट के लिए डिवाइस की थीम के रंगों का इस्तेमाल कर सकता है. इससे अलग-अलग विजेट के बीच, ट्रांज़िशन बेहतर होते हैं और एक जैसा अनुभव मिलता है.

डाइनैमिक रंग पाने के दो तरीके हैं:

  • रूट लेआउट में, सिस्टम की डिफ़ॉल्ट थीम (@android:style/Theme.DeviceDefault.DayNight) का इस्तेमाल करें.

  • Android लाइब्रेरी के लिए मटीरियल कॉम्पोनेंट से, Material 3 थीम (Theme.Material3.DynamicColors.DayNight) का इस्तेमाल करें. यह सुविधा, Android v1.6.0 के लिए मटीरियल कॉम्पोनेंट से उपलब्ध है.

रूट लेआउट में थीम सेट करने के बाद, डाइनैमिक रंग चुनने के लिए, रूट या उसके किसी भी चाइल्ड में, सामान्य रंग एट्रिब्यूट का इस्तेमाल किया जा सकता है.

यहां रंग के कुछ एट्रिब्यूट दिए गए हैं जिनका इस्तेमाल किया जा सकता है:

  • ?attr/primary
  • ?attr/primaryContainer
  • ?attr/onPrimary
  • ?attr/onPrimaryContainer

Material 3 थीम का इस्तेमाल करने वाले इस उदाहरण में, डिवाइस की थीम का रंग "बैंगनी" है. ऐक्सेंट का रंग और विजेट का बैकग्राउंड, हल्के और गहरे रंग वाले मोड के हिसाब से सेट हो जाते हैं. जैसा कि पहले और दूसरे डायग्राम में दिखाया गया है.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/colorPrimaryContainer"
    android:theme="@style/Theme.Material3.DynamicColors.DayNight">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:tint="?attr/colorPrimaryContainer"
        android:src="@drawable/ic_cloud" />

    <!-- Other widget content. -->

</LinearLayout>

हल्के रंग वाले मोड की थीम में विजेट
पहला डायग्राम. हल्के रंग वाली थीम में विजेट.
गहरे रंग वाले मोड की थीम में विजेट
दूसरा डायग्राम. गहरे रंग वाली थीम में विजेट.

डाइनैमिक रंगों के लिए, पुराने वर्शन के साथ कंपैटिबिलिटी की सुविधा

डाइनैमिक रंगों की सुविधा, सिर्फ़ Android 12 या इसके बाद के वर्शन वाले डिवाइसों में उपलब्ध है. पुराने वर्शन के लिए, पसंद के मुताबिक थीम बनाने के लिए, डिफ़ॉल्ट थीम एट्रिब्यूट का इस्तेमाल करके, पसंद के हिसाब से रंगों वाली डिफ़ॉल्ट थीम और नया क्वालिफ़ायर (values-v31) बनाएं.

यहां Material 3 थीम का इस्तेमाल करने का एक उदाहरण दिया गया है:

/values/styles.xml

<resources>
  <style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight">
    <!-- Override default colorBackground attribute with custom color. -->
    <item name="android:colorBackground">@color/my_background_color</item>

    <!-- Add other colors/attributes. -->

  </style>
</resources>

/values-v31/styles.xml

<resources>
  <!-- Do not override any color attribute. -->
  <style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight" />
</resources>

/layout/my_widget_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="?android:attr/colorBackground"
    android:theme="@style/MyWidgetTheme" />

आवाज़ से कंट्रोल करने की सुविधा चालू करना

ऐप्लिकेशन की कार्रवाइयों की मदद से, Google Assistant लोगों के काम के वॉइस कमांड के जवाब में विजेट दिखा सकती है. इन-बिल्ट इंटेंट (बीआईआई) के जवाब में विजेट दिखाने के लिए, अपने ऐप्लिकेशन को कॉन्फ़िगर करके, Assistant के इंटरफ़ेस पर विजेट दिखाए जा सकते हैं. जैसे, Android और Android Auto. लोगों के पास, Assistant की ओर से दिखाए गए विजेट को अपने लॉन्चर पर पिन करने का विकल्प होता है. इससे, लोग आने वाले समय में भी विजेट का इस्तेमाल कर सकते हैं.

उदाहरण के लिए, अपनी एक्सरसाइज़ ऐप्लिकेशन के लिए, वर्कआउट की खास जानकारी देने वाले विजेट को कॉन्फ़िगर किया जा सकता है. ऐसा करने पर, यह विजेट, GET_EXERCISE_OBSERVATION बीआईआई को ट्रिगर करने वाले वॉइस कमांड के जवाब में काम करेगा. जब लोग, "Hey Google, मैंने ExampleApp पर इस हफ़्ते कितने किलोमीटर दौड़ लगाई?" जैसे अनुरोध करके इस बीआईआई को ट्रिगर करते हैं, तो Assistant, आपका विजेट अपने-आप दिखाती है.

कई बीआईआई उपलब्ध हैं. इनमें उपयोगकर्ता के इंटरैक्शन की कई कैटगरी शामिल हैं. इससे, लगभग सभी Android ऐप्लिकेशन, आवाज़ से कंट्रोल करने के लिए अपने विजेट को बेहतर बना सकते हैं. शुरू करने के लिए, देखें Android विजेट के साथ ऐप्लिकेशन की कार्रवाइयों को इंटिग्रेट करना.

बेहतर ट्रांज़िशन की सुविधा चालू करना

Android 12 से, लॉन्चर, लोगों के विजेट से आपका ऐप्लिकेशन लॉन्च करने पर, बेहतर ट्रांज़िशन की सुविधा देते हैं.

बेहतर ट्रांज़िशन की सुविधा चालू करने के लिए, अपने बैकग्राउंड एलिमेंट की पहचान करने के लिए, @android:id/background या android.R.id.background का इस्तेमाल करें:

<!-- Top-level layout of the widget. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/background"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
</LinearLayout>

आपका ऐप्लिकेशन, Android के पुराने वर्शन पर @android:id/background का इस्तेमाल कर सकता है. हालांकि, इसे अनदेखा कर दिया जाता है.

RemoteViews में रनटाइम के दौरान बदलाव करना

Android 12 से, RemoteViews के कई तरीकों का फ़ायदा लिया जा सकता है. इनकी मदद से, RemoteViews एट्रिब्यूट में रनटाइम के दौरान बदलाव किया जा सकता है. जोड़े गए सभी तरीकों की सूची देखने के लिए, RemoteViews एपीआई रेफ़रंस देखें.

यहां कोड का एक उदाहरण दिया गया है, जिसमें इनमें से कुछ तरीकों का इस्तेमाल करने का तरीका बताया गया है.

// Set the colors of a progress bar at runtime.
remoteView.setColorStateList(
    R.id.progress, "setProgressTintList", createProgressColorStateList()
)

// Specify exact sizes for margins.
remoteView.setViewLayoutMargin(
    R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DIP
)