একটি সাধারণ উইজেট তৈরি করুন

অ্যাপ উইজেট হল ক্ষুদ্রাকৃতির অ্যাপ ভিউ যা আপনি অন্যান্য অ্যাপে এম্বেড করতে পারেন—যেমন হোম স্ক্রীন—এবং পর্যায়ক্রমিক আপডেট পেতে পারেন। এই ভিউগুলিকে ইউজার ইন্টারফেসে উইজেট হিসাবে উল্লেখ করা হয় এবং আপনি একটি অ্যাপ উইজেট প্রদানকারী (বা উইজেট প্রদানকারী ) দিয়ে একটি প্রকাশ করতে পারেন। একটি অ্যাপ কম্পোনেন্ট যা অন্যান্য উইজেট ধারণ করে তাকে অ্যাপ উইজেট হোস্ট (বা উইজেট হোস্ট ) বলা হয়। চিত্র 1 একটি নমুনা সঙ্গীত উইজেট দেখায়:

মিউজিক উইজেটের উদাহরণ
চিত্র 1. একটি সঙ্গীত উইজেটের উদাহরণ।

এই দস্তাবেজটি বর্ণনা করে কিভাবে একটি উইজেট প্রদানকারী ব্যবহার করে একটি উইজেট প্রকাশ করতে হয়। অ্যাপ উইজেট হোস্ট করতে আপনার নিজস্ব AppWidgetHost তৈরি করার বিষয়ে বিস্তারিত জানার জন্য, একটি উইজেট হোস্ট তৈরি করুন দেখুন।

আপনার উইজেট কীভাবে ডিজাইন করবেন সে সম্পর্কে তথ্যের জন্য, অ্যাপ উইজেট ওভারভিউ দেখুন।

উইজেট উপাদান

একটি উইজেট তৈরি করতে, আপনার নিম্নলিখিত মৌলিক উপাদানগুলির প্রয়োজন:

AppWidgetProviderInfo অবজেক্ট
একটি উইজেটের মেটাডেটা বর্ণনা করে, যেমন উইজেটের লেআউট, আপডেট ফ্রিকোয়েন্সি এবং AppWidgetProvider ক্লাস। AppWidgetProviderInfo XML-এ সংজ্ঞায়িত করা হয়েছে , যেমন এই নথিতে বর্ণনা করা হয়েছে।
AppWidgetProvider ক্লাস
মৌলিক পদ্ধতিগুলিকে সংজ্ঞায়িত করে যা আপনাকে প্রোগ্রাম্যাটিকভাবে উইজেটের সাথে ইন্টারফেস করতে দেয়। এটির মাধ্যমে, উইজেট আপডেট, সক্ষম, নিষ্ক্রিয় বা মুছে ফেলা হলে আপনি সম্প্রচার পাবেন। আপনি ম্যানিফেস্টে AppWidgetProvider ঘোষণা করেন এবং তারপর এই নথিতে বর্ণিত হিসাবে এটি বাস্তবায়ন করেন
লেআউট দেখুন
উইজেটের জন্য প্রাথমিক বিন্যাস সংজ্ঞায়িত করে। এই নথিতে বর্ণিত লেআউটটি XML-এ সংজ্ঞায়িত করা হয়েছে

চিত্র 2 দেখায় কিভাবে এই উপাদানগুলি সামগ্রিক অ্যাপ উইজেট প্রক্রিয়াকরণ প্রবাহের সাথে ফিট করে৷

অ্যাপ উইজেট প্রক্রিয়াকরণ প্রবাহ
চিত্র 2. অ্যাপ উইজেট প্রক্রিয়াকরণ প্রবাহ।

আপনার উইজেটের ব্যবহারকারীর কনফিগারেশনের প্রয়োজন হলে, অ্যাপ উইজেট কনফিগারেশন কার্যকলাপ বাস্তবায়ন করুন। এই কার্যকলাপ ব্যবহারকারীদের উইজেট সেটিংস পরিবর্তন করতে দেয়—উদাহরণস্বরূপ, একটি ঘড়ি উইজেটের সময় অঞ্চল।

এছাড়াও আমরা নিম্নলিখিত উন্নতিগুলির সুপারিশ করি: নমনীয় উইজেট বিন্যাস , বিবিধ বর্ধন , উন্নত উইজেট , সংগ্রহ উইজেট , এবং একটি উইজেট হোস্ট তৈরি করা

AppWidgetProviderInfo XML ঘোষণা করুন

AppWidgetProviderInfo অবজেক্ট একটি উইজেটের প্রয়োজনীয় গুণাবলী সংজ্ঞায়িত করে। একটি একক <appwidget-provider> উপাদান ব্যবহার করে একটি XML রিসোর্স ফাইলে AppWidgetProviderInfo অবজেক্টটি সংজ্ঞায়িত করুন এবং প্রকল্পের res/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/example_loading_appwidget"
    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 দেখুন। একইভাবে, minResizeHeight অ্যাট্রিবিউট উপেক্ষা করা হয় যদি এটি minHeight এর চেয়ে বড় হয় বা উল্লম্ব আকার পরিবর্তন সক্ষম না করা হয়।
maxResizeWidth এবং maxResizeHeight উইজেটের প্রস্তাবিত সর্বোচ্চ আকার নির্দিষ্ট করুন। যদি মানগুলি গ্রিড ঘরের মাত্রার একাধিক না হয়, তবে সেগুলি নিকটতম কক্ষের আকার পর্যন্ত বৃত্তাকার করা হয়৷ maxResizeWidth অ্যাট্রিবিউট উপেক্ষা করা হয় যদি এটি minWidth এর চেয়ে ছোট হয় বা অনুভূমিক আকার পরিবর্তন সক্ষম না থাকে। resizeMode দেখুন। একইভাবে, maxResizeHeight অ্যাট্রিবিউট উপেক্ষা করা হয় যদি এটি minHeight এর চেয়ে বড় হয় বা উল্লম্ব আকার পরিবর্তন সক্ষম না করা হয়। অ্যান্ড্রয়েড 12 এ চালু করা হয়েছে।
resizeMode একটি উইজেটের আকার পরিবর্তন করা যেতে পারে এমন নিয়মগুলি নির্দিষ্ট করে৷ আপনি হোম স্ক্রীন উইজেটগুলিকে অনুভূমিকভাবে, উল্লম্বভাবে বা উভয় অক্ষে আকার পরিবর্তনযোগ্য করতে এই বৈশিষ্ট্যটি ব্যবহার করতে পারেন। ব্যবহারকারীরা একটি উইজেট স্পর্শ করে এবং ধরে রাখে তার আকার পরিবর্তনের হ্যান্ডলগুলি দেখানোর জন্য, তারপর লেআউট গ্রিডে এর আকার পরিবর্তন করতে অনুভূমিক বা উল্লম্ব হ্যান্ডলগুলিকে টেনে আনুন৷ resizeMode অ্যাট্রিবিউটের মানগুলির মধ্যে horizontal , vertical এবং none অন্তর্ভুক্ত নয়। একটি উইজেটকে অনুভূমিকভাবে এবং উল্লম্বভাবে আকার পরিবর্তনযোগ্য হিসাবে ঘোষণা করতে, horizontal|vertical ব্যবহার করুন।

উদাহরণ

পূর্ববর্তী টেবিলের বৈশিষ্ট্যগুলি কীভাবে উইজেট আকারকে প্রভাবিত করে তা ব্যাখ্যা করতে, নিম্নলিখিত বৈশিষ্ট্যগুলি অনুমান করুন:

  • একটি গ্রিড সেল 30 ডিপি প্রশস্ত এবং 50 ডিপি লম্বা।
  • নিম্নলিখিত বৈশিষ্ট্য স্পেসিফিকেশন প্রদান করা হয়:
<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 বৈশিষ্ট্যগুলি ব্যবহার করুন৷

উইজেটের আকার ডিফল্টরূপে 2x2। উইজেটটির আকার 2x1 বা 4x3 পর্যন্ত পরিবর্তন করা যেতে পারে।

Android 11 এবং নিম্নতর:

উইজেটের ডিফল্ট আকার গণনা করতে minWidth এবং minHeight বৈশিষ্ট্যগুলি ব্যবহার করুন৷

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

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

উইজেটের আকার ডিফল্টরূপে 3x2। উইজেটটি 2x1 বা পূর্ণ স্ক্রীন পর্যন্ত আকার পরিবর্তন করা যেতে পারে।

অতিরিক্ত উইজেট বৈশিষ্ট্য

নিম্নলিখিত সারণীতে <appwidget-provider> বৈশিষ্ট্যগুলি বর্ণনা করা হয়েছে যা উইজেট আকার ছাড়া অন্য গুণাবলীর সাথে সম্পর্কিত।

গুণাবলী এবং বর্ণনা
updatePeriodMillis উইজেট ফ্রেমওয়ার্ক কত ঘন ঘন onUpdate() কলব্যাক পদ্ধতিতে কল করে AppWidgetProvider থেকে একটি আপডেটের অনুরোধ করে তা নির্ধারণ করে। এই মানের সাথে সঠিক সময়ে প্রকৃত আপডেট হওয়ার নিশ্চয়তা দেওয়া হয় না, এবং ব্যাটারি সংরক্ষণের জন্য আমরা যতটা সম্ভব কম সময়ে আপডেট করার পরামর্শ দিই—ঘণ্টায় একবারের বেশি নয়। একটি উপযুক্ত আপডেট সময় বাছাই করার জন্য বিবেচনার সম্পূর্ণ তালিকার জন্য, উইজেট সামগ্রী আপডেট করার জন্য অপ্টিমাইজেশন দেখুন।
initialLayout লেআউট রিসোর্সের দিকে নির্দেশ করে যা উইজেট লেআউটকে সংজ্ঞায়িত করে।
configure ব্যবহারকারী যখন উইজেট যোগ করে তখন তাদের উইজেট বৈশিষ্ট্য কনফিগার করতে দিয়ে যে কার্যকলাপটি চালু হয় তা সংজ্ঞায়িত করে। উইজেট কনফিগার করতে ব্যবহারকারীদের সক্ষম করুন দেখুন। Android 12 থেকে শুরু করে, আপনার অ্যাপ প্রাথমিক কনফিগারেশন এড়িয়ে যেতে পারে। বিস্তারিত জানার জন্য উইজেটের ডিফল্ট কনফিগারেশন ব্যবহার করুন দেখুন।
description আপনার উইজেটের জন্য প্রদর্শন করার জন্য উইজেট বাছাইকারীর বিবরণ নির্দিষ্ট করে। অ্যান্ড্রয়েড 12 এ চালু করা হয়েছে।
previewLayout (Android 12) এবং previewImage (Android 11 এবং নিম্ন)
  • অ্যান্ড্রয়েড 12 থেকে শুরু করে, previewLayout অ্যাট্রিবিউটটি একটি মাপযোগ্য প্রিভিউ নির্দিষ্ট করে, যা আপনি উইজেটের ডিফল্ট আকারে সেট করা একটি XML লেআউট হিসেবে প্রদান করেন। আদর্শভাবে, এই বৈশিষ্ট্য হিসাবে নির্দিষ্ট করা লেআউট XML বাস্তবসম্মত ডিফল্ট মান সহ প্রকৃত উইজেট হিসাবে একই লেআউট XML।
  • অ্যান্ড্রয়েড 11 বা তার নিচের সংস্করণে, previewImage অ্যাট্রিবিউট উইজেটটি কনফিগার করার পরে কেমন দেখায় তার একটি প্রিভিউ নির্দিষ্ট করে, যা ব্যবহারকারী অ্যাপ উইজেট নির্বাচন করার সময় দেখেন। যদি সরবরাহ না করা হয়, ব্যবহারকারী তার পরিবর্তে আপনার অ্যাপের লঞ্চার আইকনটি দেখতে পান। এই ক্ষেত্রটি AndroidManifest.xml ফাইলের <receiver> এলিমেন্টে android:previewImage অ্যাট্রিবিউটের সাথে মিলে যায়।
দ্রষ্টব্য: আমরা previewImage এবং previewLayout উভয় বৈশিষ্ট্যই নির্দিষ্ট করার পরামর্শ দিই যাতে ব্যবহারকারীর ডিভাইস previewLayout সমর্থন না করলে আপনার অ্যাপ previewImage ব্যবহার করতে পারে। আরও বিশদ বিবরণের জন্য, স্কেলযোগ্য উইজেট পূর্বরূপগুলির সাথে পশ্চাদগামী সামঞ্জস্য দেখুন।
autoAdvanceViewId উইজেট সাবভিউয়ের ভিউ আইডি নির্দিষ্ট করে যা উইজেটের হোস্ট দ্বারা স্বয়ংক্রিয়ভাবে উন্নত হয়।
widgetCategory আপনার উইজেট হোম স্ক্রিনে ( home_screen ), লক স্ক্রীন ( keyguard ) বা উভয়েই প্রদর্শিত হতে পারে কিনা তা ঘোষণা করে৷ Android 5.0 এবং উচ্চতর সংস্করণের জন্য, শুধুমাত্র home_screen বৈধ।
widgetFeatures উইজেট দ্বারা সমর্থিত বৈশিষ্ট্য ঘোষণা করে। উদাহরণস্বরূপ, যদি আপনি চান যে আপনার উইজেটটি তার ডিফল্ট কনফিগারেশন ব্যবহার করুক যখন একজন ব্যবহারকারী এটি যোগ করে, configuration_optional এবং reconfigurable উভয় পতাকা উল্লেখ করুন। এটি একটি ব্যবহারকারী উইজেট যোগ করার পরে কনফিগারেশন কার্যকলাপ চালু করা বাইপাস করে। ব্যবহারকারী তারপরেও উইজেটটি পুনরায় কনফিগার করতে পারেন।

উইজেট সম্প্রচার পরিচালনা করতে AppWidgetProvider ক্লাস ব্যবহার করুন

AppWidgetProvider ক্লাস উইজেট সম্প্রচার পরিচালনা করে এবং উইজেট লাইফসাইকেল ইভেন্টগুলির প্রতিক্রিয়া হিসাবে উইজেট আপডেট করে। নিম্নলিখিত বিভাগগুলি বর্ণনা করে যে কীভাবে ম্যানিফেস্টে AppWidgetProvider ঘোষণা করা যায় এবং তারপরে এটি বাস্তবায়ন করা যায়।

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

প্রথমে, আপনার অ্যাপের AndroidManifest.xml ফাইলে AppWidgetProvider ক্লাস ঘোষণা করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<receiver android:name="ExampleAppWidgetProvider"
                 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/example_appwidget_info" />
</receiver>

<receiver> উপাদানটির জন্য android:name অ্যাট্রিবিউট প্রয়োজন, যা উইজেট দ্বারা ব্যবহৃত AppWidgetProvider নির্দিষ্ট করে। আপনার AppWidgetProvider এ একটি পৃথক প্রক্রিয়া সম্প্রচার করার প্রয়োজন না হলে উপাদানটি রপ্তানি করা উচিত নয়, যা সাধারণত হয় না৷

<intent-filter> উপাদানটিতে android:name বৈশিষ্ট্য সহ একটি <action> উপাদান থাকতে হবে। এই বৈশিষ্ট্যটি নির্দিষ্ট করে যে AppWidgetProvider ACTION_APPWIDGET_UPDATE সম্প্রচার গ্রহণ করে৷ এটিই একমাত্র সম্প্রচার যা আপনাকে অবশ্যই স্পষ্টভাবে ঘোষণা করতে হবে। AppWidgetManager স্বয়ংক্রিয়ভাবে প্রয়োজনীয় হিসাবে AppWidgetProvider এ অন্যান্য সমস্ত উইজেট সম্প্রচার পাঠায়।

<meta-data> উপাদানটি AppWidgetProviderInfo রিসোর্স নির্দিষ্ট করে এবং নিম্নলিখিত বৈশিষ্ট্যগুলির প্রয়োজন:

  • android:name : মেটাডেটা নাম নির্দিষ্ট করে। AppWidgetProviderInfo বর্ণনাকারী হিসাবে ডেটা সনাক্ত করতে android.appwidget.provider ব্যবহার করুন৷
  • android:resource : AppWidgetProviderInfo সম্পদের অবস্থান নির্দিষ্ট করে।

AppWidgetProvider ক্লাস বাস্তবায়ন করুন

AppWidgetProvider ক্লাস উইজেট সম্প্রচার পরিচালনা করার জন্য একটি সুবিধার শ্রেণী হিসাবে BroadcastReceiver প্রসারিত করে। এটি শুধুমাত্র সেই ইভেন্ট সম্প্রচার গ্রহণ করে যা উইজেটের সাথে প্রাসঙ্গিক, যেমন যখন উইজেট আপডেট করা হয়, মুছে ফেলা হয়, সক্ষম করা হয় এবং অক্ষম করা হয়। যখন এই সম্প্রচার ইভেন্টগুলি ঘটে, নিম্নলিখিত AppWidgetProvider পদ্ধতিগুলিকে বলা হয়:

onUpdate()
এটিকে AppWidgetProviderInfo তে updatePeriodMillis অ্যাট্রিবিউট দ্বারা সংজ্ঞায়িত বিরতিতে উইজেট আপডেট করতে বলা হয়। আরও তথ্যের জন্য এই পৃষ্ঠায় অতিরিক্ত উইজেট বৈশিষ্ট্য বর্ণনা করে টেবিলটি দেখুন।
এই পদ্ধতিটিকেও বলা হয় যখন ব্যবহারকারী উইজেট যোগ করে, তাই এটি প্রয়োজনীয় সেটআপ সম্পাদন করে যেমন অবজেক্ট View জন্য ইভেন্ট হ্যান্ডলার নির্ধারণ করা বা উইজেটে প্রদর্শনের জন্য ডেটা লোড করার জন্য কাজ শুরু করা। যাইহোক, যদি আপনি configuration_optional পতাকা ছাড়াই একটি কনফিগারেশন কার্যকলাপ ঘোষণা করেন, ব্যবহারকারী যখন উইজেট যোগ করেন তখন এই পদ্ধতিটি বলা হয় না , তবে পরবর্তী আপডেটের জন্য এটি বলা হয় । কনফিগারেশন সম্পূর্ণ হলে প্রথম আপডেটটি সম্পাদন করা কনফিগারেশন কার্যকলাপের দায়িত্ব। আরও তথ্যের জন্য অ্যাপ উইজেট কনফিগার করতে ব্যবহারকারীদের সক্ষম করুন দেখুন।
সবচেয়ে গুরুত্বপূর্ণ কলব্যাক হল onUpdate() । আরও তথ্যের জন্য এই পৃষ্ঠায় onUpdate() ক্লাসের সাথে ইভেন্ট পরিচালনা করুন দেখুন।
onAppWidgetOptionsChanged()

এটিকে বলা হয় যখন উইজেটটি প্রথম স্থাপন করা হয় এবং যে কোনো সময় উইজেটটির আকার পরিবর্তন করা হয়। উইজেটের আকারের সীমার উপর ভিত্তি করে বিষয়বস্তু দেখাতে বা লুকানোর জন্য এই কলব্যাকটি ব্যবহার করুন। আকারের ব্যাপ্তিগুলি পান—এবং, Android 12 থেকে শুরু করে, একটি উইজেট ইন্সট্যান্স যে সম্ভাব্য আকারগুলি গ্রহণ করতে পারে তার তালিকাটি পান getAppWidgetOptions() , যা নিম্নলিখিতগুলি অন্তর্ভুক্ত করে এমন একটি Bundle প্রদান করে:

  • OPTION_APPWIDGET_MIN_WIDTH : একটি উইজেট দৃষ্টান্তের dp ইউনিটে প্রস্থে নিম্ন সীমা রয়েছে।
  • OPTION_APPWIDGET_MIN_HEIGHT : একটি উইজেট দৃষ্টান্তের dp ইউনিটে উচ্চতার নিম্ন সীমা রয়েছে৷
  • OPTION_APPWIDGET_MAX_WIDTH : একটি উইজেট দৃষ্টান্তের dp ইউনিটে প্রস্থের উপরের সীমা রয়েছে৷
  • OPTION_APPWIDGET_MAX_HEIGHT : একটি উইজেট দৃষ্টান্তের dp ইউনিটে উচ্চতার উপরের সীমা রয়েছে৷
  • OPTION_APPWIDGET_SIZES : dp ইউনিটে সম্ভাব্য মাপের তালিকা রয়েছে ( List<SizeF> ), যা একটি উইজেট উদাহরণ নিতে পারে। অ্যান্ড্রয়েড 12 এ চালু করা হয়েছে।
onDeleted(Context, int[])

প্রতিবার উইজেট হোস্ট থেকে উইজেট মুছে ফেলা হলে একে বলা হয়।

onEnabled(Context)

এটি বলা হয় যখন উইজেটের একটি উদাহরণ প্রথমবার তৈরি করা হয়। উদাহরণস্বরূপ, যদি ব্যবহারকারী আপনার উইজেটের দুটি দৃষ্টান্ত যোগ করে, এটি শুধুমাত্র প্রথমবার বলা হয়। আপনি যদি একটি নতুন ডাটাবেস খুলতে চান বা অন্য একটি সেটআপ করতে চান যা শুধুমাত্র সমস্ত উইজেট দৃষ্টান্তের জন্য একবার ঘটতে হবে, তাহলে এটি করার জন্য এটি একটি ভাল জায়গা।

onDisabled(Context)

এটি বলা হয় যখন আপনার উইজেটের শেষ উদাহরণটি উইজেট হোস্ট থেকে মুছে ফেলা হয়। এখানেই আপনি onEnabled(Context) এ করা যেকোনো কাজ পরিষ্কার করেন, যেমন একটি অস্থায়ী ডাটাবেস মুছে ফেলা।

onReceive(Context, Intent)

এটি প্রতিটি সম্প্রচারের জন্য এবং পূর্ববর্তী প্রতিটি কলব্যাক পদ্ধতির আগে বলা হয়। আপনার সাধারণত এই পদ্ধতিটি প্রয়োগ করার প্রয়োজন নেই, কারণ ডিফল্ট AppWidgetProvider বাস্তবায়ন সমস্ত উইজেট সম্প্রচারকে ফিল্টার করে এবং পূর্ববর্তী পদ্ধতিগুলিকে উপযুক্ত হিসাবে কল করে।

আপনাকে অবশ্যই AndroidManifest<receiver> উপাদান ব্যবহার করে একটি সম্প্রচার রিসিভার হিসেবে আপনার AppWidgetProvider ক্লাস বাস্তবায়ন ঘোষণা করতে হবে। আরও তথ্যের জন্য এই পৃষ্ঠার ম্যানিফেস্টে একটি উইজেট ঘোষণা দেখুন।

onUpdate() ক্লাস দিয়ে ইভেন্টগুলি পরিচালনা করুন

সবচেয়ে গুরুত্বপূর্ণ AppWidgetProvider কলব্যাক হল onUpdate() , কারণ এটি বলা হয় যখন প্রতিটি উইজেট একটি হোস্টে যোগ করা হয়, যদি না আপনি configuration_optional পতাকা ছাড়া কনফিগারেশন কার্যকলাপ ব্যবহার করেন। যদি আপনার উইজেট কোনো ব্যবহারকারীর ইন্টারঅ্যাকশন ইভেন্ট গ্রহণ করে, তাহলে এই কলব্যাকে ইভেন্ট হ্যান্ডলারদের নিবন্ধন করুন। যদি আপনার উইজেট অস্থায়ী ফাইল বা ডাটাবেস তৈরি না করে, বা অন্য কাজ সম্পাদন করে যার জন্য পরিষ্কার-পরিচ্ছন্নতার প্রয়োজন হয়, তাহলে onUpdate() হতে পারে একমাত্র কলব্যাক পদ্ধতি যা আপনাকে সংজ্ঞায়িত করতে হবে।

উদাহরণস্বরূপ, আপনি যদি একটি বোতাম সহ একটি উইজেট চান যা ট্যাপ করার সময় একটি কার্যকলাপ চালু করে, আপনি AppWidgetProvider এর নিম্নলিখিত বাস্তবায়ন ব্যবহার করতে পারেন:

কোটলিন

class ExampleAppWidgetProvider : AppWidgetProvider() {

    override fun onUpdate(
            context: Context,
            appWidgetManager: AppWidgetManager,
            appWidgetIds: IntArray
    ) {
        // Perform this loop procedure for each widget that belongs to this
        // provider.
        appWidgetIds.forEach { appWidgetId ->
            // Create an Intent to launch ExampleActivity.
            val pendingIntent: PendingIntent = PendingIntent.getActivity(
                    /* context = */ context,
                    /* requestCode = */  0,
                    /* intent = */ Intent(context, ExampleActivity::class.java),
                    /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
            )

            // Get the layout for the widget and attach an onClick listener to
            // the button.
            val views: RemoteViews = RemoteViews(
                    context.packageName,
                    R.layout.appwidget_provider_layout
            ).apply {
                setOnClickPendingIntent(R.id.button, pendingIntent)
            }

            // Tell the AppWidgetManager to perform an update on the current
            // widget.
            appWidgetManager.updateAppWidget(appWidgetId, views)
        }
    }
}

জাভা

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // Perform this loop procedure for each widget that belongs to this
        // provider.
        for (int i=0; i < appWidgetIds.length; i++) {
            int appWidgetId = appWidgetIds[i];
            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(
                /* context = */ context,
                /* requestCode = */ 0,
                /* intent = */ intent,
                /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
            );

            // Get the layout for the widget and attach an onClick listener to
            // the button.
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current app
            // widget.
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

এই AppWidgetProvider শুধুমাত্র onUpdate() পদ্ধতিটি সংজ্ঞায়িত করে, এটি একটি PendingIntent তৈরি করতে ব্যবহার করে যা একটি Activity চালু করে এবং setOnClickPendingIntent(int, PendingIntent) ব্যবহার করে উইজেটের বোতামে সংযুক্ত করে। এটি একটি লুপ অন্তর্ভুক্ত করে যা appWidgetIds এ প্রতিটি এন্ট্রির মাধ্যমে পুনরাবৃত্তি করে, যা আইডিগুলির একটি অ্যারে যা এই প্রদানকারীর দ্বারা তৈরি প্রতিটি উইজেট সনাক্ত করে৷ ব্যবহারকারী যদি উইজেটের একাধিক দৃষ্টান্ত তৈরি করে, তবে সেগুলি একই সাথে আপডেট হয়। যাইহোক, উইজেটের সমস্ত দৃষ্টান্তের জন্য শুধুমাত্র একটি updatePeriodMillis সময়সূচী পরিচালিত হয়। উদাহরণস্বরূপ, যদি আপডেটের সময়সূচীটি প্রতি দুই ঘন্টায় সংজ্ঞায়িত করা হয়, এবং উইজেটের একটি দ্বিতীয় দৃষ্টান্ত প্রথমটির এক ঘন্টা পরে যোগ করা হয়, তাহলে তারা উভয়ই প্রথম দ্বারা সংজ্ঞায়িত সময়ের এবং দ্বিতীয় আপডেটের সময়কালে আপডেট করা হয়। উপেক্ষা করা হয়। তারা উভয়ই প্রতি ঘন্টায় নয়, প্রতি ঘন্টায় আপডেট করে।

আরো বিস্তারিত জানার জন্য ExampleAppWidgetProvider.java নমুনা ক্লাস দেখুন।

উইজেট সম্প্রচারের অভিপ্রায় গ্রহণ করুন

AppWidgetProvider হল একটি সুবিধার ক্লাস। আপনি যদি সরাসরি উইজেট সম্প্রচার পেতে চান, তাহলে আপনি আপনার নিজস্ব BroadcastReceiver প্রয়োগ করতে পারেন বা onReceive(Context,Intent) কলব্যাককে ওভাররাইড করতে পারেন। আপনার যে উদ্দেশ্যগুলির যত্ন নেওয়া দরকার তা হল:

উইজেট লেআউট তৈরি করুন

আপনাকে অবশ্যই XML-এ আপনার উইজেটের জন্য একটি প্রাথমিক বিন্যাস নির্ধারণ করতে হবে এবং প্রকল্পের res/layout/ ডিরেক্টরিতে সংরক্ষণ করতে হবে। বিস্তারিত জানার জন্য ডিজাইন নির্দেশিকা পড়ুন।

আপনি যদি লেআউটের সাথে পরিচিত হন তাহলে উইজেট লেআউট তৈরি করা সহজ। যাইহোক, সচেতন থাকুন যে উইজেট লেআউটগুলি RemoteViews এর উপর ভিত্তি করে তৈরি করা হয়, যা প্রতিটি ধরণের লেআউট বা ভিজেটকে সমর্থন করে না৷ আপনি RemoteViews দ্বারা সমর্থিত ভিউগুলির কাস্টম ভিউ বা সাবক্লাস ব্যবহার করতে পারবেন না।

RemoteViews এছাড়াও ViewStub সমর্থন করে, যা একটি অদৃশ্য, শূন্য-আকারের View আপনি রানটাইমে লেআউট সংস্থানগুলিকে অলসভাবে স্ফীত করতে ব্যবহার করতে পারেন।

রাষ্ট্রীয় আচরণের জন্য সমর্থন

Android 12 নিম্নলিখিত বিদ্যমান উপাদানগুলি ব্যবহার করে রাষ্ট্রীয় আচরণের জন্য সমর্থন যোগ করে:

উইজেটটি এখনও রাষ্ট্রহীন। আপনার অ্যাপ্লিকেশানকে অবশ্যই রাজ্য সংরক্ষণ করতে হবে এবং রাজ্য পরিবর্তন ইভেন্টগুলির জন্য নিবন্ধন করতে হবে৷

শপিং লিস্ট উইজেটের উদাহরণ রাষ্ট্রীয় আচরণ দেখাচ্ছে
চিত্র 3. রাষ্ট্রীয় আচরণের উদাহরণ।

নিম্নলিখিত কোড উদাহরণ দেখায় কিভাবে এই উপাদান বাস্তবায়ন করতে.

কোটলিন

// Check the view.
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true)

// Check a radio group.
remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2)

// Listen for check changes. The intent has an extra with the key
// EXTRA_CHECKED that specifies the current checked state of the view.
remoteView.setOnCheckedChangeResponse(
        R.id.my_checkbox,
        RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent)
)

জাভা

// Check the view.
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true);

// Check a radio group.
remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2);

// Listen for check changes. The intent has an extra with the key
// EXTRA_CHECKED that specifies the current checked state of the view.
remoteView.setOnCheckedChangeResponse(
    R.id.my_checkbox,
    RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent));

দুটি লেআউট প্রদান করুন: একটি টার্গেটিং ডিভাইস যেগুলি res/layout-v31 এ Android 12 বা তার বেশি চলমান, এবং অন্যটি ডিফল্ট res/layout ফোল্ডারে পূর্ববর্তী Android 11 বা তার নিচের সংস্করণগুলিকে লক্ষ্য করে৷

বৃত্তাকার কোণগুলি প্রয়োগ করুন

অ্যান্ড্রয়েড 12 আপনার উইজেটের গোলাকার কোণগুলির রেডিআই সেট করতে নিম্নলিখিত সিস্টেম প্যারামিটারগুলি প্রবর্তন করে:

  • system_app_widget_background_radius : উইজেট ব্যাকগ্রাউন্ডের কোণার ব্যাসার্ধ, যা কখনই 28 dp-এর চেয়ে বড় হয় না।

  • system_app_widget_inner_radius : উইজেটের ভিতরে যেকোন ভিউ এর কোণার ব্যাসার্ধ। এটি একটি 8 ডিপি প্যাডিং ব্যবহার করার সময় সুন্দরভাবে সারিবদ্ধ করার জন্য পটভূমি ব্যাসার্ধের থেকে ঠিক 8 ডিপি কম।

নিম্নলিখিত উদাহরণটি একটি উইজেট দেখায় যা উইজেটের কোণে system_app_widget_background_radius এবং উইজেটের ভিউয়ের জন্য system_app_widget_inner_radius ব্যবহার করে।

উইজেট উইজেট ব্যাকগ্রাউন্ডের ব্যাসার্ধ এবং উইজেটের ভিতরে ভিউ দেখাচ্ছে
চিত্র 4. গোলাকার কোণগুলি।

উইজেটের 1 কোণ।

উইজেটের ভিতরে একটি দৃশ্যের 2 কোণ।

বৃত্তাকার কোণগুলির জন্য গুরুত্বপূর্ণ বিবেচনা

  • থার্ড-পার্টি লঞ্চার এবং ডিভাইস নির্মাতারা system_app_widget_background_radius প্যারামিটার 28 dp-এর থেকে ছোট হতে ওভাররাইড করতে পারে। system_app_widget_inner_radius প্যারামিটার সবসময় system_app_widget_background_radius এর মানের থেকে 8 dp কম।
  • যদি আপনার উইজেট @android:id/background ব্যবহার না করে বা একটি ব্যাকগ্রাউন্ড সংজ্ঞায়িত না করে যা তার বিষয়বস্তুকে সীমারেখার উপর ভিত্তি করে ক্লিপ করে — android:clipToOutline true সেট করে — লঞ্চার স্বয়ংক্রিয়ভাবে ব্যাকগ্রাউন্ড শনাক্ত করে এবং বৃত্তাকার কোণ সহ একটি আয়তক্ষেত্র ব্যবহার করে উইজেটটিকে ক্লিপ করে 16 ডিপি পর্যন্ত। আপনার উইজেটটি Android 12 এর সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করুন।

অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলির সাথে উইজেট সামঞ্জস্যের জন্য, আমরা কাস্টম বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করার এবং Android 12 এর জন্য সেগুলিকে ওভাররাইড করতে একটি কাস্টম থিম ব্যবহার করার পরামর্শ দিই, যেমনটি নিম্নলিখিত নমুনা XML ফাইলগুলিতে দেখানো হয়েছে:

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

/layout/my_widget_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  ...
  android:background="@drawable/my_widget_background" />