Glance-এর সাহায্যে অ্যাপ উইজেট তৈরি করা

Glance-এর সাহায্যে কীভাবে একটি প্রাথমিক অ্যাপ উইজেট তৈরি করতে হয় তা নিম্নলিখিত বিভাগে বর্ণনা করা হয়েছে।

ম্যানিফেস্টে AppWidget ঘোষণা করুন

সেট-আপ ধাপ সম্পূর্ণ করার পরে, আপনার অ্যাপে AppWidget এবং এর মেটাডেটা ঘোষণা করুন।

  1. GlanceAppWidgetReceiver থেকে AppWidget রিসিভার এক্সটেন্ড করুন:

    class MyAppWidgetReceiver : GlanceAppWidgetReceiver() {
        override val glanceAppWidget: GlanceAppWidget = TODO("Create GlanceAppWidget")
    }

  2. আপনার AndroidManifest.xml ফাইলে এবং সংশ্লিষ্ট মেটাডেটা ফাইলে অ্যাপ উইজেটের প্রদানকারীকে রেজিস্টার করুন:

        <receiver android:name=".glance.MyReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/my_app_widget_info" />
    </receiver>
    

AppWidgetProviderInfo মেটাডেটা যোগ করুন

এরপরে, @xml/my_app_widget_info ফাইলে অ্যাপ উইজেট সংক্রান্ত তথ্য তৈরি ও সংজ্ঞায়িত করতে, উইজেট তৈরি করুন গাইড অনুসরণ করুন।

Glance-এর ক্ষেত্রে একমাত্র পার্থক্য হল, কোনও initialLayout XML নেই, কিন্তু আপনাকে অবশ্যই একটি নির্ধারণ করতে হবে। আপনি লাইব্রেরিতে প্রদত্ত পূর্বনির্ধারিত লোডিং লেআউট ব্যবহার করতে পারেন:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/glance_default_loading_layout">
</appwidget-provider>

AppWidgetProviderInfo XML ঘোষণা করা

AppWidgetProviderInfo অবজেক্ট আপনার উইজেটের গুরুত্বপূর্ণ কোয়ালিটি নির্ধারণ করে। <appwidget-provider> এলিমেন্টের মধ্যে আপনার XML মেটাডেটা রিসোর্স ফাইলে AppWidgetProviderInfo ডিফাইন করুন (res/xml/my_app_widget_info.xml):

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:targetCellWidth="1"
    android:targetCellHeight="1"
    android:maxResizeWidth="250dp"
    android:maxResizeHeight="120dp"
    android:updatePeriodMillis="86400000"
    android:description="@string/example_appwidget_description"
    android:previewLayout="@layout/example_appwidget_preview"
    android:initialLayout="@layout/glance_default_loading_layout"
    android:configure="com.example.android.ExampleAppWidgetConfigurationActivity"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen"
    android:widgetFeatures="reconfigurable|configuration_optional">
</appwidget-provider>

উইজেটের সাইজ সংক্রান্ত অ্যাট্রিবিউট

ডিফল্ট হোম স্ক্রিন, সেলের গ্রিডের উপর ভিত্তি করে উইন্ডোতে উইজেট প্লেস করে যেগুলির নির্দিষ্ট উচ্চতা ও প্রস্থ আছে। বেশিরভাগ হোম স্ক্রিনে উইজেটকে শুধুমাত্র গ্রিড সেলের পূর্ণ সংখ্যায় গুণিতক সাইজ নিতে দেওয়া হয়—যেমন, দুটি সেল হরাইজন্টালি ও তিনটি সেল ভার্টিকালি।

উইজেটের সাইজ সংক্রান্ত অ্যাট্রিবিউট আপনাকে উইজেটের ডিফল্ট সাইজ নির্দিষ্ট করতে এবং উইজেটের সাইজের নিম্ন ও উচ্চ সীমা প্রদান করতে দেয়। এই প্রসঙ্গে, উইজেটের ডিফল্ট সাইজ হল সেই সাইজ যা উইজেটটি প্রথমবার হোম স্ক্রিনে যোগ করার সময় নেয়।

নিচের সারণীতে উইজেটের সাইজ সংক্রান্ত <appwidget-provider> অ্যাট্রিবিউট সম্পর্কে বর্ণনা করা হয়েছে:

অ্যাট্রিবিউট ও বিবরণ
targetCellWidth এবং targetCellHeight (Android 12), minWidth এবং minHeight
  • Android 12 থেকে শুরু করে, targetCellWidth এবং targetCellHeight অ্যাট্রিবিউট গ্রিড সেল অনুযায়ী উইজেটের ডিফল্ট সাইজ নির্দিষ্ট করে। Android 11 ও এর আগের যেকোনও ভার্সনে এইসব অ্যাট্রিবিউট উপেক্ষা করা হয় এবং হোম স্ক্রিনে গ্রিড-ভিত্তিক লেআউট কাজ না করলে এগুলি উপেক্ষা করা যেতে পারে।
  • minWidth এবং minHeight অ্যাট্রিবিউট dp-তে উইজেটের ডিফল্ট সাইজ নির্দিষ্ট করে। কোনও উইজেটের ন্যূনতম প্রস্থ বা উচ্চতার মান সেলের ডাইমেনশনের সাথে না মিললে, মানগুলিকে নিকটতম সেল সাইজে রাউন্ড আপ করা হয়।
আমরা সাজেস্ট করি যে অ্যাট্রিবিউটের দুটি সেটই নির্দিষ্ট করুন—targetCellWidth এবং targetCellHeight, এবং minWidth এবং minHeight—যাতে ব্যবহারকারীর ডিভাইসে targetCellWidth এবং targetCellHeight কাজ না করলে আপনার অ্যাপ minWidth এবং minHeight ব্যবহার করতে পারে। কাজ করলে, targetCellWidth এবং targetCellHeight অ্যাট্রিবিউট minWidth এবং minHeight অ্যাট্রিবিউটের চেয়ে বেশি প্রাধান্য পায়।
minResizeWidth এবং minResizeHeight উইজেটের সর্বনিম্ন সাইজ নির্দিষ্ট করুন। এইসব ভ্যালু সেই সাইজ নির্দিষ্ট করে যার নিচে উইজেটটি অস্পষ্ট বা অন্যভাবে ব্যবহারযোগ্য নয়। এইসব অ্যাট্রিবিউট ব্যবহার করে ব্যবহারকারী উইজেটের সাইজ পরিবর্তন করে ডিফল্ট উইজেট সাইজের চেয়ে ছোট করতে পারেন। minResizeWidth অ্যাট্রিবিউটটি minWidth-এর থেকে বড় হলে অথবা হরাইজন্টাল রি-সাইজিং চালু না থাকলে উপেক্ষা করা হয়। resizeMode দেখুন। একইভাবে, উল্লম্বভাবে সাইজ পরিবর্তন করার সুবিধা চালু করা না থাকলে অথবা minHeight-এর থেকে বেশি হলে minResizeHeight অ্যাট্রিবিউট উপেক্ষা করা হয়।
maxResizeWidth এবং maxResizeHeight উইজেটের সাজেস্ট করা সর্বাধিক সাইজ উল্লেখ করুন। মানগুলি গ্রিড সেলের ডাইমেনশনের মাল্টিপল না হলে, সেগুলি নিকটতম সেল সাইজে রাউন্ড আপ করা হয়। maxResizeWidth অ্যাট্রিবিউটটি উপেক্ষা করা হয় যদি এটি minWidth-এর থেকে ছোট হয় অথবা যদি অনুভূমিকভাবে সাইজ পরিবর্তন করার সুবিধা চালু না থাকে। resizeMode দেখুন। একইভাবে, minHeight-এর চেয়ে ছোট হলে অথবা উল্লম্বভাবে সাইজ পরিবর্তন করার সুবিধা চালু করা না থাকলে, maxResizeHeight অ্যাট্রিবিউট উপেক্ষা করা হয়। Android 12-এ চালু করা হয়েছে।
resizeMode যেসব নিয়ম মেনে উইজেটের সাইজ পরিবর্তন করা যায় তা উল্লেখ করে। আপনি এই অ্যাট্রিবিউট ব্যবহার করে হোম স্ক্রিন উইজেটকে হরাইজন্টাল, ভার্টিক্যাল বা উভয় অ্যাক্সিস বরাবর ছোট-বড় করতে পারবেন। ব্যবহারকারীরা উইজেট টাচ করে ধরে রাখলে, সেটির সাইজ পরিবর্তন করার হ্যান্ডেল দেখতে পান, তারপর লেআউট গ্রিডে সেটির সাইজ পরিবর্তন করতে অনুভূমিক বা উল্লম্ব হ্যান্ডেল টেনে আনেন। resizeMode অ্যাট্রিবিউটের ভ্যালুর মধ্যে horizontal, vertical ও none পড়ে। কোনও উইজেটকে অনুভূমিক ও উল্লম্বভাবে রিসাইজ করা যায় বলে ঘোষণা করতে, horizontal|vertical ব্যবহার করুন।

উদাহরণ

পূর্ববর্তী সারণীতে অ্যাট্রিবিউট কীভাবে উইজেটের সাইজকে প্রভাবিত করে তা বোঝাতে, নিম্নলিখিত স্পেসিফিকেশন ধরে নিন:

  • গ্রিড সেল ৩০ dp চওড়া ও ৫০ dp লম্বা।
  • নিম্নলিখিত অ্যাট্রিবিউট স্পেসিফিকেশন প্রদান করা হয়েছে:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="80dp"
    android:minHeight="80dp"
    android:targetCellWidth="2"
    android:targetCellHeight="2"
    android:minResizeWidth="40dp"
    android:minResizeHeight="40dp"
    android:maxResizeWidth="120dp"
    android:maxResizeHeight="120dp"
    android:resizeMode="horizontal|vertical" />

Android 12 থেকে শুরু করে:

উইজেটের ডিফল্ট সাইজ হিসেবে targetCellWidth ও targetCellHeight অ্যাট্রিবিউট ব্যবহার করুন।

ডিফল্ট হিসেবে উইজেটের সাইজ ২x২ হয়। উইজেটের সাইজ কমিয়ে ২x১ বা বাড়িয়ে ৪x৩ করা যেতে পারে।

Android 11 ও তার আগের যেকোনও ভার্সনে:

উইজেটের ডিফল্ট সাইজ গণনা করতে minWidth ও minHeight অ্যাট্রিবিউট ব্যবহার করুন।

ডিফল্ট প্রস্থ = Math.ceil(80 / 30) = ৩

ডিফল্ট উচ্চতা = Math.ceil(80 / 50) = ২

ডিফল্ট হিসেবে উইজেটের সাইজ ৩x২ হয়। উইজেটটি ২x১ সাইজ পর্যন্ত ছোট করা বা ফুল-স্ক্রিন পর্যন্ত বড় করা যেতে পারে।

অতিরিক্ত উইজেট অ্যাট্রিবিউট

নিচের সারণীতে উইজেটের সাইজ ছাড়া অন্যান্য কোয়ালিটি সম্পর্কিত <appwidget-provider> অ্যাট্রিবিউট বর্ণনা করা হয়েছে।

অ্যাট্রিবিউট ও বিবরণ
updatePeriodMillis উইজেট ফ্রেমওয়ার্ক কত ঘনঘন GlanceAppWidgetReceiver থেকে আপডেট করার অনুরোধ করে তা onUpdate() কলব্যাক পদ্ধতির মাধ্যমে নির্ধারণ করা হয়। ব্যাটারি সাশ্রয় করতে, আমরা যত কম সম্ভব আপডেট করার সাজেস্ট করি—এক ঘণ্টায় একবারের বেশি নয়। আরও বিবরণের জন্য, Glance স্টেট ম্যানেজমেন্টে কখন উইজেট আপডেট করতে হয় বিভাগ দেখুন।
initialLayout Glance UI কম্পোজিশন রেন্ডার করার আগে উইজেটের লোডিং লেআউটকে সংজ্ঞায়িত করে এমন লেআউট রিসোর্সের দিকে পয়েন্ট করে। আপনি লাইব্রেরিতে দেওয়া আগে থেকে নির্দিষ্ট লোডিং লেআউট ব্যবহার করতে পারেন: @layout/glance_default_loading_layout.
configure ব্যবহারকারী উইজেট যোগ করলে চালু হওয়া কনফিগারেশন অ্যাক্টিভিটি নির্ধারণ করে। ব্যবহারকারীদের অ্যাপ উইজেট কনফিগার করার সুবিধা চালু করা গাইড দেখুন।
description আপনার উইজেটের জন্য উইজেট পিকারের বিবরণ নির্দিষ্ট করে। Android 12-এ চালু করা হয়েছে।
previewLayout (Android 12) এবং previewImage (Android 11 ও তার আগের যেকোনও ভার্সন)
  • Android 12 থেকে শুরু করে, previewLayout অ্যাট্রিবিউট একটি স্কেলেবল প্রিভিউ নির্দিষ্ট করে, যা আপনি উইজেটের ডিফল্ট সাইজে সেট করা XML লেআউট হিসেবে প্রদান করেন। আদর্শভাবে, এটি আপনার ডিজাইন লেআউটের সাথে মানানসই একটি স্ট্যাটিক XML ম্যাপিংয়ের দিকে পয়েন্ট করে।
  • Android 11 বা এর আগের যেকোনও ভার্সনে, previewImage অ্যাট্রিবিউট উইজেট পিকারের মধ্যে উইজেটটি দেখতে কেমন হবে তার একটি স্ট্যাটিক ইমেজ ড্রয়েবল স্ক্রিনশট নির্দিষ্ট করে।
আমাদের সাজেশন হল, দুটিই নির্দিষ্ট করুন যাতে আপনার অ্যাপ পুরনো প্ল্যাটফর্মেও ভালভাবে কাজ করতে পারে। নতুন প্ল্যাটফর্মের (Android 15+) জন্য, আপনি `GlanceAppWidget.providePreview` ব্যবহার করে Kotlin-এ লাইভ জেনারেটেড প্রিভিউ নির্ধারণ করতে পারবেন। জেনারেটেড প্রিভিউ গাইড দেখুন।
autoAdvanceViewId উইজেটের হোস্টের মাধ্যমে অটো-অ্যাডভান্স করা উইজেট সাবভিউয়ের ভিউ আইডি নির্দিষ্ট করে।
widgetCategory আপনার উইজেট হোম স্ক্রিন (home_screen), লক স্ক্রিন (keyguard) নাকি দু'জায়গাতেই দেখানো যাবে তা ঘোষণা করে। Android 5.0 ও তার পরবর্তী যেকোনও ভার্সনের জন্য, শুধুমাত্র home_screen কাজ করে।
widgetFeatures উইজেটে কাজ করে এমন ফিচার ঘোষণা করে। যেমন, আপনার উইজেটের কনফিগারেশন ঐচ্ছিক হলে, configuration_optional ও reconfigurable, দুটিই উল্লেখ করুন।

GlanceAppWidget-এর সংজ্ঞা দাও

  1. GlanceAppWidget থেকে এক্সটেন্ড করে এবং provideGlance মেথডকে ওভাররাইড করে এমন একটি নতুন ক্লাস তৈরি করুন। এটি এমন একটি পদ্ধতি যেখানে আপনি সেই ডেটা লোড করতে পারবেন যা আপনার উইজেট রেন্ডার করার জন্য প্রয়োজন:

    class MyAppWidget : GlanceAppWidget() {
    
        override suspend fun provideGlance(context: Context, id: GlanceId) {
    
            // In this method, load data needed to render the AppWidget.
            // Use `withContext` to switch to another thread for long running
            // operations.
    
            provideContent {
                // create your AppWidget here
                Text("Hello World")
            }
        }
    }

  2. আপনার GlanceAppWidgetReceiver-এ glanceAppWidget-এ এটি ইনস্ট্যানশিয়েট করুন:

    class MyAppWidgetReceiver : GlanceAppWidgetReceiver() {
    
        // Let MyAppWidgetReceiver know which GlanceAppWidget to use
        override val glanceAppWidget: GlanceAppWidget = MyAppWidget()
    }

আপনি এখন Glance ব্যবহার করে AppWidget কনফিগার করেছেন।

উইজেট ব্রডকাস্ট ম্যানেজ করতে GlanceAppWidgetReceiver ক্লাস ব্যবহার করুন

GlanceAppWidgetReceiver কোঅর্ডিনেট উইজেট ব্রডকাস্ট করে এবং প্ল্যাটফর্মের স্ট্যাটাস আপডেট করে, এর জন্য অন্তর্নিহিত AppWidgetProvider-কে এক্সটেন্ড করা হয়। আপনার উইজেট আপডেট, মুছে ফেলা, চালু বা বন্ধ করা হলে এটি প্ল্যাটফর্ম ইভেন্ট পায়, সেগুলি Compose লাইফসাইকেল অনুরোধে ট্রান্সলেট করে।

ম্যানিফেস্টে উইজেট ঘোষণা করা

আপনার GlanceAppWidgetReceiver ক্লাস সাবক্লাসকে আপনার AndroidManifest.xml ফাইলে ব্রডকাস্ট রিসিভার হিসেবে ঘোষণা করুন:

<receiver android:name="MyReceiver"
          android:exported="false">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/my_app_widget_info" />
</receiver>

<receiver> এলিমেন্টে android:name অ্যাট্রিবিউট থাকতে হবে, যা প্রাপক ক্লাস নির্দিষ্ট করে। প্রাপককে অবশ্যই <intent-filter>-এর মধ্যে ACTION_APPWIDGET_UPDATE ব্রডকাস্ট অ্যাকশন গ্রহণ করতে হবে।

<meta-data> এলিমেন্টকে অবশ্যই নিজের নাম android.appwidget.provider হিসেবে শনাক্ত করতে হবে এবং android:resource অ্যাট্রিবিউটকে অবশ্যই আপনার AppWidgetProviderInfo XML মেটাডেটা রিসোর্সের (@xml/my_app_widget_info) দিকে পয়েন্ট করতে হবে।

GlanceAppWidgetReceiver ক্লাস প্রয়োগ করা

Glance-এ, আপনি সরাসরি AppWidgetProvider-এর পরিবর্তে GlanceAppWidgetReceiver এক্সটেন্ড করেন। আপনার রিসিভারকে আপনার GlanceAppWidget ইন্সট্যান্সের সাথে লিঙ্ক করে এটি প্রয়োগ করুন। -এ উপলভ্য প্রাথমিক কলব্যাক GlanceAppWidgetReceiver নিম্নলিখিতভাবে কাজ করে:

  • onUpdate(): কম্পোজিশন আপডেট কার্যকর করতে Glance অটোমেটিক ওভাররাইড করে। আপনি ম্যানুয়ালি onUpdate ওভাররাইড করলে, Glance-কে কম্পোজিশন থ্রেড সফলভাবে লঞ্চ করার অনুমতি দিতে আপনাকে অবশ্যই কল করতে হবে super.onUpdate।
  • onAppWidgetOptionsChanged(): উইজেট প্রথমবার প্লেস করা হলে বা সাইজ পরিবর্তন করা হলে কল করা হয়। Glance রিড বিকল্পগুলি ব্যাকগ্রাউন্ডে আইটেম বান্ডেল করে, যাতে রানটাইম ডাইমেনশনের উপর ভিত্তি করে আপনার লেআউট নিখুঁতভাবে অ্যাডজাস্ট হয়।
  • onDeleted(Context, IntArray): ব্যবহারকারী কোনও নির্দিষ্ট উইজেট ইনস্ট্যান্স মুছে দিলে এটি চালু হয়।
  • onEnabled(Context): আপনার উইজেটের প্রথম ইনস্ট্যান্স সফলভাবে তৈরি হলে ট্রিগার হয়। গ্লোবাল মাইগ্রেশন চালানোর জন্য অসাধারণ।
  • onDisabled(Context): প্রোভাইডারের শেষ অ্যাক্টিভ ইনস্ট্যান্স সরিয়ে দেওয়া হলে কল করা হয়।
  • onReceive(Context, Intent): নির্দিষ্ট কলব্যাক পদ্ধতির আগে প্রতিটি প্ল্যাটফর্ম ব্রডকাস্ট ইন্টারসেপ্ট করে। আপনি যে কাস্টম রিসিভার লজিক লেখেন তা super.onReceive(context, intent) কল করে এবং কখনও কল করে না goAsync কারণ Glance অটোমেটিক অ্যাসিঙ্ক্রোনাস পদ্ধতিতে কাজ রাউট করে।

উইজেট ব্রডকাস্ট ইনটেন্ট পাওয়া

GlanceAppWidgetReceiver নিম্নলিখিত ফাউন্ডেশনাল প্ল্যাটফর্ম উইজেট ব্রডকাস্ট ইনটেন্ট ফিল্টার ও হ্যান্ডেল করে:

UI তৈরি করা

UI কীভাবে তৈরি করতে হয় তা নিম্নলিখিত স্নিপেট থেকে বোঝা যাবে:

/* Import Glance Composables
 In the event there is a name clash with the Compose classes of the same name,
 you may rename the imports per https://kotlinlang.org/docs/packages.html#imports
 using the `as` keyword.

import androidx.glance.Button
import androidx.glance.layout.Column
import androidx.glance.layout.Row
import androidx.glance.text.Text
*/
class MyAppWidget : GlanceAppWidget() {

    override suspend fun provideGlance(context: Context, id: GlanceId) {
        // Load data needed to render the AppWidget.
        // Use `withContext` to switch to another thread for long running
        // operations.

        provideContent {
            // create your AppWidget here
            MyContent()
        }
    }

    @Composable
    private fun MyContent() {
        Column(
            modifier = GlanceModifier.fillMaxSize(),
            verticalAlignment = Alignment.Top,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = "Where to?", modifier = GlanceModifier.padding(12.dp))
            Row(horizontalAlignment = Alignment.CenterHorizontally) {
                Button(
                    text = "Home",
                    onClick = actionStartActivity<MyActivity>()
                )
                Button(
                    text = "Work",
                    onClick = actionStartActivity<MyActivity>()
                )
            }
        }
    }
}

আগের কোড স্যাম্পেলটি নিম্নলিখিত কাজগুলি করে:

  • সবচেয়ে উপরের লেভেলে Column, আইটেমগুলি উল্লম্বভাবে একটির পরে একটি করে সাজানো হয়।
  • উপলভ্য স্পেসের সাথে মানানসই হতে Column-এর সাইজ বড় করা হয় (এর মাধ্যমে GlanceModifier এবং এর কন্টেন্ট উপরের দিকে (verticalAlignment) অ্যালাইন করা হয় এবং এটি অনুভূমিকভাবে সেন্টারে রাখা হয় (horizontalAlignment)।
  • Column-এর কন্টেন্ট ল্যাম্বডা ব্যবহার করে সংজ্ঞায়িত করা হয়। ক্রম গুরুত্বপূর্ণ।
    • Column-এর প্রথম আইটেমটি হল Text কম্পোনেন্ট যার 12.dp প্যাডিং আছে।
    • দ্বিতীয় আইটেমটি হল Row, যেখানে আইটেমগুলি অনুভূমিকভাবে একটি পরে একটি করে রাখা হয়, সাথে দুটি Buttons অনুভূমিকভাবে কেন্দ্রে রাখা হয় (horizontalAlignment)। চূড়ান্ত ডিসপ্লে উপলভ্য স্পেসের উপর নির্ভর করে। নিচের ছবিটি থেকে আপনি বুঝতে পারবেন যে এটি দেখতে কেমন হতে পারে:
destination_widget
ছবি ১. UI-এর একটি উদাহরণ।

কম্পোনেন্টের প্লেসমেন্ট ও সাইজ পরিবর্তন করতে, আপনি অ্যালাইনমেন্ট ভ্যালু পরিবর্তন করতে পারেন অথবা আলাদা মডিফায়ার ভ্যালু (যেমন প্যাডিং) প্রয়োগ করতে পারেন। প্রতিটি ক্লাসের জন্য কম্পোনেন্ট, প্যারামিটার ও উপলভ্য মডিফায়ারের সম্পূর্ণ তালিকা পেতে রেফারেন্স ডকুমেন্টেশন দেখুন।

গোলাকার কোণ প্রয়োগ করা

Android 12, আপনার অ্যাপ উইজেটের কোণের ব্যাসার্ধ ডায়নামিক কাস্টমাইজ করার জন্য সিস্টেম প্যারামিটার চালু করে:

  • system_app_widget_background_radius: উইজেট ব্যাকগ্রাউন্ড কন্টেনারের কোণের রেডিয়াস নির্দিষ্ট করে (কখনও ২৮ dp-এর চেয়ে বড় নয়)।
  • ভেতরের ব্যাসার্ধ: কন্টেন্ট ক্লিপিং প্রতিরোধ করতে, সিস্টেম ব্যাকগ্রাউন্ড আউটলাইনের উপর ভিত্তি করে আপনার ভেতরের কন্টেন্টের জন্য একটি আনুপাতিক ব্যাসার্ধ গণনা করুন: systemRadiusValue - widgetPadding

Glance-এ, আপনি কম্পোজিশনে GlanceModifier.cornerRadius(android.R.dimen.system_app_widget_background_radius) ব্যবহার করে কোণের রেডিয়াস সাইজিং প্রপার্টি ডায়নামিক প্রয়োগ করতে পারবেন।

Android 11 (API লেভেল 30) বা এর নিচের ভার্সনে চলা ডিভাইসে পুরনো মানানসই ভার্সনের জন্য, কাস্টম অ্যাট্রিবিউট ও কাস্টম থিম রিসোর্স ফলব্যাক প্রয়োগ করুন:

  • /values/attrs.xml

    <resources>
    <attr name="backgroundRadius" format="dimension" />
    </resources>
    
  • /values/styles.xml

    <resources>
    <style name="MyWidgetTheme">
      <item name="backgroundRadius">@dimen/my_background_radius_dimen</item>
    </style>
    </resources>
    
  • /values-31/styles.xml

    <resources>
    <style name="MyWidgetTheme" parent="@android:style/Theme.DeviceDefault.DayNight">
      <item name="backgroundRadius">@android:dimen/system_app_widget_background_radius</item>
    </style>
    </resources>
    
  • /drawable/my_widget_background.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="?attr/backgroundRadius" />
    </shape>