এই পৃষ্ঠায় অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১)-এ প্রবর্তিত উইজেটের আকার পরিবর্তনের পরিমার্জন এবং অধিকতর নমনীয়তা সম্পর্কে বর্ণনা করা হয়েছে। এতে আপনার উইজেটের আকার কীভাবে নির্ধারণ করবেন , সে বিষয়েও বিস্তারিত বলা হয়েছে।
উইজেটের আকার এবং লেআউটের জন্য উন্নত এপিআই ব্যবহার করুন
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) থেকে শুরু করে, আপনি নিম্নলিখিত কাজগুলো করার মাধ্যমে আরও পরিমার্জিত সাইজ অ্যাট্রিবিউট এবং ফ্লেক্সিবল লেআউট প্রদান করতে পারেন, যা পরবর্তী বিভাগগুলোতে বর্ণনা করা হয়েছে:
অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলিতে, OPTION_APPWIDGET_MIN_WIDTH , OPTION_APPWIDGET_MIN_HEIGHT , OPTION_APPWIDGET_MAX_WIDTH , এবং OPTION_APPWIDGET_MAX_HEIGHT এক্সট্রাগুলি ব্যবহার করে একটি উইজেটের আকারের পরিসীমা জানা এবং তারপর উইজেটটির আকার অনুমান করা সম্ভব ছিল, কিন্তু সেই যুক্তিটি সব পরিস্থিতিতে কাজ করে না। অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণের জন্য তৈরি উইজেটগুলির ক্ষেত্রে, আমরা রেসপন্সিভ বা এক্সাক্ট লেআউট প্রদান করার পরামর্শ দিই।
উইজেটের আকারের উপর অতিরিক্ত সীমাবদ্ধতা নির্দিষ্ট করুন
অ্যান্ড্রয়েড ১২-এ এমন এপিআই যুক্ত করা হয়েছে, যার মাধ্যমে আপনি বিভিন্ন স্ক্রিন আকারের ডিভাইসে আপনার উইজেটের আকার আরও নির্ভরযোগ্যভাবে নিশ্চিত করতে পারবেন।
বিদ্যমান minWidth , minHeight , minResizeWidth , এবং minResizeHeight অ্যাট্রিবিউটগুলোর পাশাপাশি, নিম্নলিখিত নতুন appwidget-provider অ্যাট্রিবিউটগুলো ব্যবহার করুন:
targetCellWidthএবংtargetCellHeight: লঞ্চার গ্রিড সেলের সাপেক্ষে উইজেটটির চূড়ান্ত আকার নির্ধারণ করে। যদি নির্ধারণ করা থাকে, তবেminWidthবাminHeightএর পরিবর্তে এই অ্যাট্রিবিউটগুলো ব্যবহৃত হয়।maxResizeWidthএবংmaxResizeHeight: উইজেটটির সর্বোচ্চ আকার নির্ধারণ করে, যে আকারে লঞ্চারটি ব্যবহারকারীকে উইজেটটি পরিবর্তন করার অনুমতি দেয়।
নিম্নলিখিত XML-এ সাইজিং অ্যাট্রিবিউটগুলো কীভাবে ব্যবহার করতে হয় তা দেখানো হয়েছে।
<appwidget-provider
...
android:targetCellWidth="3"
android:targetCellHeight="2"
android:maxResizeWidth="250dp"
android:maxResizeHeight="110dp">
</appwidget-provider>
রেসপন্সিভ লেআউট প্রদান করুন
উইজেটের আকারের উপর নির্ভর করে যদি লেআউট পরিবর্তন করার প্রয়োজন হয়, তবে আমরা কয়েকটি লেআউটের একটি ছোট সেট তৈরি করার পরামর্শ দিই, যার প্রতিটি বিভিন্ন আকারের জন্য প্রযোজ্য হবে। যদি এটি সম্ভব না হয়, তবে আরেকটি বিকল্প হলো রানটাইমে উইজেটের সঠিক আকারের উপর ভিত্তি করে লেআউট সরবরাহ করা, যেমনটি এই পৃষ্ঠায় বর্ণনা করা হয়েছে।
এই ফিচারটি আরও মসৃণ স্কেলিং এবং সার্বিকভাবে সিস্টেমের উন্নত স্বাস্থ্য নিশ্চিত করে, কারণ উইজেটটিকে ভিন্ন আকারে প্রদর্শন করার জন্য প্রতিবার সিস্টেমকে অ্যাপটিকে জাগিয়ে তুলতে হয় না।
নিম্নলিখিত কোড উদাহরণটিতে লেআউটগুলির একটি তালিকা কীভাবে প্রদান করতে হয় তা দেখানো হয়েছে।
কোটলিন
override fun onUpdate(...) { val smallView = ... val tallView = ... val wideView = ... val viewMapping: Map<SizeF, RemoteViews> = mapOf( SizeF(150f, 100f) to smallView, SizeF(150f, 200f) to tallView, SizeF(215f, 100f) to wideView ) val remoteViews = RemoteViews(viewMapping) appWidgetManager.updateAppWidget(id, remoteViews) }
জাভা
@Override public void onUpdate(...) { RemoteViews smallView = ...; RemoteViews tallView = ...; RemoteViews wideView = ...; Map<SizeF, RemoteViews> viewMapping = new ArrayMap<>(); viewMapping.put(new SizeF(150f, 100f), smallView); viewMapping.put(new SizeF(150f, 200f), tallView); viewMapping.put(new SizeF(215f, 100f), wideView); RemoteViews remoteViews = new RemoteViews(viewMapping); appWidgetManager.updateAppWidget(id, remoteViews); }
ধরে নিন উইজেটটির নিম্নলিখিত অ্যাট্রিবিউটগুলো রয়েছে:
<appwidget-provider
android:minResizeWidth="160dp"
android:minResizeHeight="110dp"
android:maxResizeWidth="250dp"
android:maxResizeHeight="200dp">
</appwidget-provider>
পূর্ববর্তী কোড স্নিপেটটির অর্থ নিম্নরূপ:
-
smallView160dp (minResizeWidth) × 110dp (minResizeHeight) থেকে 160dp × 199dp (পরবর্তী কাটঅফ পয়েন্ট - 1dp) পর্যন্ত সমর্থন করে। -
tallView১৬০ডিপি × ২০০ডিপি থেকে ২১৪ডিপি (পরবর্তী কাটঅফ পয়েন্ট - ১) × ২০০ডিপি পর্যন্ত সমর্থন করে। wideView215dp × 110dp (minResizeHeight) থেকে 250dp (maxResizeWidth) × 200dp (maxResizeHeight) পর্যন্ত সমর্থন করে।
আপনার উইজেটকে অবশ্যই minResizeWidth × minResizeHeight থেকে maxResizeWidth × maxResizeHeight পর্যন্ত আকারের পরিসর সমর্থন করতে হবে। এই পরিসরের মধ্যে, আপনি লেআউট পরিবর্তনের জন্য একটি নির্দিষ্ট সীমা নির্ধারণ করতে পারেন।

সঠিক বিন্যাস প্রদান করুন
যদি অল্প কয়েকটি রেসপন্সিভ লেআউট দেওয়া সম্ভব না হয়, তবে তার পরিবর্তে আপনি উইজেটটি যে আকারে প্রদর্শিত হবে, সেই অনুযায়ী বিভিন্ন লেআউট সরবরাহ করতে পারেন। সাধারণত ফোনের জন্য দুটি আকার (পোর্ট্রেট এবং ল্যান্ডস্কেপ মোড) এবং ফোল্ডেবল ডিভাইসের জন্য চারটি আকার থাকে।
এই সমাধানটি বাস্তবায়ন করতে, আপনার অ্যাপকে নিম্নলিখিত ধাপগুলো সম্পাদন করতে হবে:
AppWidgetProvider.onAppWidgetOptionsChanged()ওভারলোড করুন, যা সাইজের সেট পরিবর্তিত হলে কল করা হয়।AppWidgetManager.getAppWidgetOptions()কল করুন, যা সাইজগুলো সম্বলিত একটিBundleরিটার্ন করে।BundleথেকেAppWidgetManager.OPTION_APPWIDGET_SIZESকী-টি অ্যাক্সেস করুন।
নিম্নলিখিত কোড উদাহরণটি দেখায় কিভাবে সঠিক লেআউট প্রদান করতে হয়।
কোটলিন
override fun onAppWidgetOptionsChanged( context: Context, appWidgetManager: AppWidgetManager, id: Int, newOptions: Bundle? ) { super.onAppWidgetOptionsChanged(context, appWidgetManager, id, newOptions) // Get the new sizes. val sizes = newOptions?.getParcelableArrayList<SizeF>( AppWidgetManager.OPTION_APPWIDGET_SIZES ) // Check that the list of sizes is provided by the launcher. if (sizes.isNullOrEmpty()) { return } // Map the sizes to the RemoteViews that you want. val remoteViews = RemoteViews(sizes.associateWith(::createRemoteViews)) appWidgetManager.updateAppWidget(id, remoteViews) } // Create the RemoteViews for the given size. private fun createRemoteViews(size: SizeF): RemoteViews { }
জাভা
@Override public void onAppWidgetOptionsChanged( Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); // Get the new sizes. ArrayList<SizeF> sizes = newOptions.getParcelableArrayList(AppWidgetManager.OPTION_APPWIDGET_SIZES); // Check that the list of sizes is provided by the launcher. if (sizes == null || sizes.isEmpty()) { return; } // Map the sizes to the RemoteViews that you want. Map<SizeF, RemoteViews> viewMapping = new ArrayMap<>(); for (SizeF size : sizes) { viewMapping.put(size, createRemoteViews(size)); } RemoteViews remoteViews = new RemoteViews(viewMapping); appWidgetManager.updateAppWidget(id, remoteViews); } // Create the RemoteViews for the given size. private RemoteViews createRemoteViews(SizeF size) { }
আপনার উইজেটের জন্য একটি আকার নির্ধারণ করুন।
অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলির জন্য প্রতিটি উইজেটকে অবশ্যই একটি targetCellWidth এবং targetCellHeight নির্ধারণ করতে হবে—অথবা অ্যান্ড্রয়েডের সকল সংস্করণের জন্য minWidth এবং minHeight যা ডিফল্টরূপে উইজেটটির ব্যবহৃত ন্যূনতম স্থান নির্দেশ করে। তবে, ব্যবহারকারীরা যখন তাদের হোম স্ক্রিনে একটি উইজেট যোগ করেন, তখন এটি সাধারণত আপনার নির্দিষ্ট করা ন্যূনতম প্রস্থ এবং উচ্চতার চেয়ে বেশি জায়গা নেয়।
অ্যান্ড্রয়েড হোম স্ক্রিন ব্যবহারকারীদের জন্য একটি গ্রিড প্রদান করে, যেখানে তারা উইজেট এবং আইকন রাখতে পারেন। এই গ্রিড ডিভাইসভেদে ভিন্ন হতে পারে; উদাহরণস্বরূপ, অনেক হ্যান্ডসেটে একটি ৫x৪ গ্রিড থাকে এবং ট্যাবলেটে আরও বড় গ্রিড থাকতে পারে। যখন আপনার উইজেটটি যোগ করা হয়, তখন অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসে এর targetCellWidth এবং targetCellHeight সীমাবদ্ধতা, অথবা অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) বা তার নিম্নতর সংস্করণে চালিত ডিভাইসে minWidth এবং minHeight সীমাবদ্ধতা পূরণের জন্য এটিকে আনুভূমিক ও উল্লম্বভাবে ন্যূনতম সংখ্যক সেল জুড়ে প্রসারিত করা হয়।
একটি সেলের প্রস্থ ও উচ্চতা এবং উইজেটে প্রয়োগ করা স্বয়ংক্রিয় মার্জিনের আকার ডিভাইসভেদে ভিন্ন হতে পারে। আপনার কাঙ্ক্ষিত গ্রিড সেলের সংখ্যার উপর ভিত্তি করে, একটি সাধারণ ৫x৪ গ্রিড হ্যান্ডসেটে আপনার উইজেটের ন্যূনতম মাত্রা মোটামুটিভাবে অনুমান করতে নিম্নলিখিত সারণিটি ব্যবহার করুন:
| সেলের সংখ্যা (প্রস্থ x উচ্চতা) | পোর্ট্রেট মোডে (dp) উপলব্ধ আকার | ল্যান্ডস্কেপ মোডে উপলব্ধ আকার (dp) |
|---|---|---|
| ১x১ | ৫৭x১০২ডিপি | ১২৭x৫১ডিপি |
| ২x১ | ১৩০x১০২ডিপি | ২৬৯x৫১ডিপি |
| ৩x১ | ২০৩x১০২ডিপি | ৪১২x৫১ডিপি |
| ৪x১ | ২৭৬x১০২ডিপি | ৫৫৪x৫১ডিপি |
| ৫x১ | ৩৪৯x১০২ডিপি | ৬৯৭x৫১ডিপি |
| ৫x২ | ৩৪৯x২২০ডিপি | ৬৯৭x১১৭ডিপি |
| ৫x৩ | ৩৪৯x৩৩৭ডিপি | ৬৯৭x১৮৪ডিপি |
| ৫x৪ | ৩৪৯x৪৫৫ডিপি | ৬৯৭x২৫০ডিপি |
| ... | ... | ... |
| এনএক্সএম | (৭৩ উত্তর - ১৬) x (১১৮ মধ্য - ১৬) | (১৪২n - ১৫) x (৬৬m - ১৫) |
minWidth , minResizeWidth , এবং maxResizeWidth অ্যাট্রিবিউটগুলোর জন্য যে মানগুলো দেবেন, তা নির্ধারণ করতে পোর্ট্রেট মোডের সেল সাইজগুলো ব্যবহার করুন। একইভাবে, minHeight , minResizeHeight , এবং maxResizeHeight অ্যাট্রিবিউটগুলোর জন্য যে মানগুলো দেবেন, তা নির্ধারণ করতে ল্যান্ডস্কেপ মোডের সেল সাইজগুলো ব্যবহার করুন।
এর কারণ হলো, পোর্ট্রেট মোডে সেলের প্রস্থ সাধারণত ল্যান্ডস্কেপ মোডের চেয়ে কম হয়—এবং একইভাবে, ল্যান্ডস্কেপ মোডে সেলের উচ্চতাও সাধারণত পোর্ট্রেট মোডের চেয়ে কম হয়।
উদাহরণস্বরূপ, যদি আপনি একটি গুগল পিক্সেল ৪-এ আপনার উইজেটের প্রস্থকে একটি সেল পর্যন্ত ছোট-বড় করতে চান, তাহলে আপনাকে আপনার minResizeWidth সর্বোচ্চ 56dp-তে সেট করতে হবে, যাতে minResizeWidth অ্যাট্রিবিউটের মান 57dp-এর চেয়ে ছোট হয়—কারণ পোর্ট্রেট মোডে একটি সেলের প্রস্থ কমপক্ষে 57dp হয়। একইভাবে, যদি আপনি একই ডিভাইসে আপনার উইজেটের উচ্চতাকে একটি সেল পর্যন্ত ছোট-বড় করতে চান, তাহলে আপনাকে আপনার minResizeHeight সর্বোচ্চ 50dp-তে সেট করতে হবে, যাতে minResizeHeight অ্যাট্রিবিউটের মান 51dp-এর চেয়ে ছোট হয়—কারণ ল্যান্ডস্কেপ মোডে একটি সেলের উচ্চতা কমপক্ষে 51dp হয়।
প্রতিটি উইজেট minResizeWidth / minResizeHeight এবং maxResizeWidth / maxResizeHeight অ্যাট্রিবিউটগুলোর মধ্যবর্তী আকারের পরিসরের মধ্যে রিসাইজযোগ্য, যার অর্থ হলো এটিকে এই পরিসরগুলোর মধ্যবর্তী যেকোনো আকারের পরিসরের সাথে মানিয়ে নিতে হবে।
উদাহরণস্বরূপ, উইজেট স্থাপনের সময় এর ডিফল্ট আকার নির্ধারণ করতে, আপনি নিম্নলিখিত অ্যাট্রিবিউটগুলো সেট করতে পারেন:
<appwidget-provider
android:targetCellWidth="3"
android:targetCellHeight="2"
android:minWidth="180dp"
android:minHeight="110dp">
</appwidget-provider>
এর মানে হলো, উইজেটটির ডিফল্ট সাইজ হলো 3x2 সেল, যা targetCellWidth এবং targetCellHeight অ্যাট্রিবিউট দ্বারা নির্দিষ্ট করা থাকে—অথবা 180×110dp, যা Android 11 বা তার নিচের সংস্করণে চালিত ডিভাইসগুলোর জন্য minWidth এবং minHeight দ্বারা নির্দিষ্ট করা থাকে। পরের ক্ষেত্রে, ডিভাইসের ওপর নির্ভর করে সেলের সাইজ ভিন্ন হতে পারে।
এছাড়াও, আপনার উইজেটের সমর্থিত আকারের পরিসীমা নির্ধারণ করতে, আপনি নিম্নলিখিত অ্যাট্রিবিউটগুলো সেট করতে পারেন:
<appwidget-provider
android:minResizeWidth="180dp"
android:minResizeHeight="110dp"
android:maxResizeWidth="530dp"
android:maxResizeHeight="450dp">
</appwidget-provider>
পূর্ববর্তী অ্যাট্রিবিউটগুলো দ্বারা নির্দিষ্ট করা অনুযায়ী, উইজেটটির প্রস্থ 180dp থেকে 530dp পর্যন্ত এবং উচ্চতা 110dp থেকে 450dp পর্যন্ত পরিবর্তনযোগ্য। এরপর, নিম্নলিখিত শর্তগুলো পূরণ সাপেক্ষে উইজেটটি 3x2 থেকে 5x2 সেল পর্যন্ত পরিবর্তনযোগ্য:
- ডিভাইসটিতে ৫x৪ গ্রিড রয়েছে।
- সেল সংখ্যা এবং ডিপিএস-এ উপলব্ধ আকারের মধ্যেকার সম্পর্কটি এই পৃষ্ঠায় ন্যূনতম ডাইমেনশনের অনুমান দেখানো সারণীটি অনুসরণ করে।
- উইজেটটি সেই আকারের পরিসরের সাথে খাপ খাইয়ে নেয়।
কোটলিন
val smallView = RemoteViews(context.packageName, R.layout.widget_weather_forecast_small) val mediumView = RemoteViews(context.packageName, R.layout.widget_weather_forecast_medium) val largeView = RemoteViews(context.packageName, R.layout.widget_weather_forecast_large) val viewMapping: Map<SizeF, RemoteViews> = mapOf( SizeF(180f, 110f) to smallView, SizeF(270f, 110f) to mediumView, SizeF(270f, 280f) to largeView ) appWidgetManager.updateAppWidget(appWidgetId, RemoteViews(viewMapping))
জাভা
RemoteViews smallView = new RemoteViews(context.getPackageName(), R.layout.widget_weather_forecast_small); RemoteViews mediumView = new RemoteViews(context.getPackageName(), R.layout.widget_weather_forecast_medium); RemoteViews largeView = new RemoteViews(context.getPackageName(), R.layout.widget_weather_forecast_large); Map<SizeF, RemoteViews> viewMapping = new ArrayMap<>(); viewMapping.put(new SizeF(180f, 110f), smallView); viewMapping.put(new SizeF(270f, 110f), mediumView); viewMapping.put(new SizeF(270f, 280f), largeView); RemoteViews remoteViews = new RemoteViews(viewMapping); appWidgetManager.updateAppWidget(id, remoteViews);
ধরে নিন উইজেটটি পূর্ববর্তী কোড স্নিপেটগুলিতে সংজ্ঞায়িত রেসপন্সিভ লেআউটগুলি ব্যবহার করে। এর মানে হল, R.layout.widget_weather_forecast_small হিসাবে নির্দিষ্ট লেআউটটি 180dp ( minResizeWidth ) x 110dp ( minResizeHeight ) থেকে 269x279dp (পরবর্তী কাটঅফ পয়েন্ট - 1) পর্যন্ত ব্যবহৃত হয়। একইভাবে, R.layout.widget_weather_forecast_medium 270x110dp থেকে 270x279dp পর্যন্ত ব্যবহৃত হয়, এবং R.layout.widget_weather_forecast_large 270x280dp থেকে 530dp ( maxResizeWidth ) x 450dp ( maxResizeHeight ) পর্যন্ত ব্যবহৃত হয়।
ব্যবহারকারী যখন উইজেটটির আকার পরিবর্তন করেন, তখন এর চেহারাও সেলগুলোর প্রতিটি আকারের সাথে মানিয়ে নিতে পরিবর্তিত হয়, যেমনটি নিম্নলিখিত উদাহরণগুলিতে দেখানো হয়েছে।

R.layout.widget_weather_forecast_small . 
R.layout.widget_weather_forecast_medium . 
R.layout.widget_weather_forecast_medium . 
R.layout.widget_weather_forecast_large . 
R.layout.widget_weather_forecast_large .
