আপনার উইজেট পিকারে প্রিভিউ যোগ করা

আপনার অ্যাপের উইজেট পিকার অভিজ্ঞতা উন্নত করতে, Android 15 ও তার পরের যেকোনও ভার্সনে চলে এমন ডিভাইসে জেনারেট করা উইজেটের প্রিভিউ, Android 12 থেকে Android 14 ডিভাইসের জন্য স্কেল করা উইজেট প্রিভিউ (previewLayout নির্দিষ্ট করে) এবং আগের ভার্সনের জন্য previewImage প্রদান করুন।

জেনারেট করা উইজেট প্রিভিউ আপনাকে নিজের উইজেটের জন্য ডায়নামিক, পছন্দমতো প্রিভিউ তৈরি করতে দেয় যা ব্যবহারকারীর হোম স্ক্রিনে উইজেটটি ঠিক কেমন দেখাবে তা সঠিকভাবে দেখায়। Android 15 ও তার পরের যেকোনও ভার্সনের জন্য, এগুলি পুশ API-এর মাধ্যমে প্রদান করা হয়, যার অর্থ হল আপনার অ্যাপ, উইজেট হোস্টের থেকে কোনও সুস্পষ্ট অনুরোধ না পেয়েও, সেটির লাইফসাইকেলের যেকোনও পয়েন্টে প্রিভিউ প্রদান করে।

আরও তথ্যের জন্য, YouTube-এ লাইভ আপডেট ও উইজেটের মাধ্যমে আপনার অ্যাপকে আরও উন্নত করুন দেখুন।

জেনারেট করা প্রিভিউ যোগ করা

Android 15 বা এর পরবর্তী যেকোনও ভার্সনের ডিভাইসে জেনারেট করা উইজেটের প্রিভিউ দেখাতে, প্রথমে মডিউল build.gradle ফাইলে compileSdk ভ্যালু ৩৫ বা তার পরবর্তী যেকোনও ভ্যালু হিসেবে সেট করুন, যাতে উইজেট পিকারকে RemoteViews প্রদান করার ক্ষমতা থাকে

অ্যাপ AppWidgetManager-এ setWidgetPreview ব্যবহার করতে পারে। অপব্যবহার প্রতিরোধ করতে এবং সিস্টেমের স্বাস্থ্য সম্পর্কিত উদ্বেগ কমাতে, setWidgetPreview হল একটি রেট-সীমিত API। ডিফল্ট সীমা হল প্রতি ঘণ্টায় আনুমানিক দুটি কল।

প্রিভিউ প্রদান করার জন্য সিস্টেম থেকে কোনও কলব্যাক নেই, তাই আপনার অ্যাপকে অবশ্যই setWidgetPreviews-কে কখন কল করতে হবে তা সিদ্ধান্ত নিতে হবে। আপডেট কৌশল আপনার উইজেটের ব্যবহারিক ক্ষেত্রের উপর নির্ভর করে:

  • উইজেটে স্ট্যাটিক তথ্য থাকলে বা সেটি দ্রুত অ্যাকশন হলে, অ্যাপ প্রথমবার লঞ্চ করার সময় প্রিভিউ সেট করুন।
  • আপনার অ্যাপে ডেটা থাকলে তবেই আপনি প্রিভিউ সেট করতে পারবেন; যেমন, কোনও ব্যবহারকারী সাইন-ইন করলে বা প্রাথমিক সেট-আপের পরে।
  • আপনি বেছে নেওয়া ক্যাডেন্স অনুযায়ী প্রিভিউ আপডেট করার জন্য একটি পিরিয়ডিক টাস্ক সেট-আপ করতে পারেন।

নিচের উদাহরণটি একটি XML উইজেট লেআউট রিসোর্স লোড করে এবং এটিকে প্রিভিউ হিসেবে সেট করে। এই স্নিপেটে setWidgetPreview-কে একটি পদ্ধতি হিসেবে দেখাতে হলে, compileSdk বিল্ড সেটিং ৩৫ বা তার পরের যেকোনও ভার্সন প্রয়োজন।

AppWidgetManager.getInstance(appContext).setWidgetPreview(
    ComponentName(
        appContext,
        ExampleAppWidgetReceiver::class.java
    ),
    AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
    RemoteViews("com.example", R.layout.widget_preview)
)

স্কেলেবল উইজেট প্রিভিউ যোগ করা

Android 12 থেকে শুরু করে, উইজেট পিকারে দেখানো উইজেট প্রিভিউ স্কেল করা যায়। আপনি এটি উইজেটের ডিফল্ট সাইজে সেট করা XML লেআউট হিসেবে প্রদান করেন। আগে, উইজেট প্রিভিউ ছিল একটি স্ট্যাটিক ড্রয়েবল রিসোর্স, যা কিছু ক্ষেত্রে উইজেট হোম স্ক্রিনে যোগ করার পরে কেমন দেখাবে তা সঠিকভাবে প্রতিফলিত করতে পারত না।

স্কেলেবল উইজেট প্রিভিউ প্রয়োগ করতে, XML লেআউট প্রদান করার জন্য appwidget-provider এলিমেন্টের previewLayout অ্যাট্রিবিউট ব্যবহার করুন:

<appwidget-provider
    android:previewLayout="@layout/my_widget_preview">
</appwidget-provider>

আমরা সাজেস্ট করি যে আসল উইজেটের মতো একই লেআউট ব্যবহার করুন, সাথে বাস্তবসম্মত ডিফল্ট বা টেস্ট ভ্যালু ব্যবহার করুন। বেশিরভাগ অ্যাপ একই previewLayout ও initialLayout ব্যবহার করে। সঠিক প্রিভিউ লেআউট তৈরি করার নির্দেশাবলী পেতে, ডায়নামিক আইটেম সহ সঠিক প্রিভিউ তৈরি করুন লিঙ্কে দেখুন।

আমরা সাজেস্ট করি যে previewLayout ও previewImage, দুটি অ্যাট্রিবিউটই নির্দিষ্ট করুন, যাতে ব্যবহারকারীর ডিভাইসে previewLayout কাজ না করলে আপনার অ্যাপ previewImage ব্যবহার করতে পারে। previewLayout অ্যাট্রিবিউটটি previewImage অ্যাট্রিবিউটের চেয়ে বেশি অগ্রাধিকার পায়।

ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য স্ট্যাটিক উইজেট প্রিভিউ যোগ করা

Android 11 (API লেভেল 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>

জাল তালিকা আইটেম প্রদান করতে, আপনি একাধিকবার লেআউট অন্তর্ভুক্ত করতে পারেন, কিন্তু এটি প্রতিটি তালিকা আইটেমকে অভিন্ন করে তোলে। অনন্য তালিকা আইটেম প্রদান করতে, এইসব ধাপ অনুসরণ করুন:

  1. টেক্সট ভ্যালুর জন্য অ্যাট্রিবিউটের একটি সেট তৈরি করুন:

    <resources>
        <attr name="widgetTitle" format="string" />
        <attr name="widgetContent" format="string" />
    </resources>
    
  2. টেক্সট সেট করতে এইসব অ্যাট্রিবিউট ব্যবহার করুন:

    <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>
    
  3. প্রিভিউয়ের জন্য যতগুলি স্টাইল প্রয়োজন ততগুলি তৈরি করুন। প্রতিটি স্টাইলে ভ্যালু নতুন করে নির্ধারণ করুন:

    <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>
    
  4. প্রিভিউ লেআউটে নকল আইটেমে স্টাইল প্রয়োগ করুন:

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