Android 10 (API লেভেল ২৯) এবং তার পরবর্তী যেকোনও ভার্সনে ডার্ক থিম উপলভ্য। এতে নিম্নলিখিত সুবিধাগুলি রয়েছে:
- ডিভাইসের স্ক্রিন টেকনোলজির উপর নির্ভর করে, উল্লেখযোগ্য পরিমাণে বিদ্যুতের ব্যবহার কমায়।
- স্বল্প দৃষ্টিশক্তি সম্পন্ন এবং উজ্জ্বল আলোতে সংবেদনশীল ব্যবহারকারীদের জন্য দৃশ্যমানতা উন্নত করে।
- কম আলোর পরিবেশে ডিভাইস ব্যবহার করা সহজ করে তোলে।
Android সিস্টেম UI এবং ডিভাইসে চলা অ্যাপে ডার্ক থিম প্রয়োগ করা হয়।
Android 10 ও তার পরবর্তী যেকোনও ভার্সনে ডার্ক থিম চালু করার তিনটি উপায় আছে:
- ডার্ক থিম চালু করতে সেটিংস > ডিসপ্লে > থিম বিকল্পে গিয়ে সিস্টেম সেটিংস ব্যবহার করুন।
- চালু করা থাকলে, বিজ্ঞপ্তি ট্রে থেকে থিম পরিবর্তন করতে কুইক সেটিংস টাইল ব্যবহার করুন।
- Pixel ডিভাইসে, একই সাথে ডার্ক থিম চালু করতে ব্যাটারি সেভার মোড চালু করুন। অন্যান্য ডিভাইসে এই আচরণ কাজ নাও করতে পারে।
WebView কম্পোনেন্ট ব্যবহার করে ওয়েব-ভিত্তিক কন্টেন্টে ডার্ক থিম প্রয়োগ করার নির্দেশাবলীর জন্য, WebView-তে ওয়েব কন্টেন্ট ডার্ক করা দেখুন।
আপনার অ্যাপে ডার্ক থিম কাজ করে
ডার্ক থিম সাপোর্ট করতে, আপনার অ্যাপের থিম সেট করুন—সাধারণত
res/values/styles.xml-এ পাওয়া যায়—DayNight থিম থেকে ইনহেরিট করতে:
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
এছাড়াও, আপনি মেটেরিয়াল কম্পোনেন্ট ডার্ক থিম ব্যবহার করতে পারেন:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
এটি অ্যাপের মূল থিমকে সিস্টেম-নিয়ন্ত্রিত নাইট মোড ফ্ল্যাগের সাথে যুক্ত করে এবং এটি চালু থাকলে অ্যাপটিকে একটি ডিফল্ট ডার্ক থিম দেয়।
থিম ও স্টাইল
লাইট থিমে ব্যবহারের জন্য হার্ডকোড করা রঙ বা আইকন ব্যবহার করা এড়িয়ে চলুন। পরিবর্তে থিম অ্যাট্রিবিউট বা নাইট-কোয়ালিফায়েড রিসোর্স ব্যবহার করুন।
ডার্ক থিমের জন্য দুটি থিম অ্যাট্রিবিউট সবচেয়ে গুরুত্বপূর্ণ:
?android:attr/textColorPrimary: সাধারণ-উদ্দেশ্যে ব্যবহৃত টেক্সটের রঙ। এটি লাইট থিমে প্রায়-কালো এবং ডার্ক থিমে প্রায়-সাদা রঙের হয়। এতে একটি বন্ধ করা অবস্থা রয়েছে।?attr/colorControlNormal: সাধারণ-উদ্দেশ্যে ব্যবহৃত আইকনের রঙ। এতে একটি বন্ধ করা অবস্থা রয়েছে।
আমরা মেটেরিয়াল ডিজাইন
কম্পোনেন্ট ব্যবহার করার সাজেশন দিই, কারণ এর কালার থিমিং
সিস্টেম, যেমন থিম
অ্যাট্রিবিউট ?attr/colorSurface এবং ?attr/colorOnSurface, উপযুক্ত রঙে সহজে অ্যাক্সেস
প্রদান করে। আপনার থিমে এইসব অ্যাট্রিবিউট কাস্টমাইজ করতে পারবেন।
অ্যাপ-মধ্যস্থ থিম পরিবর্তন করা
অ্যাপ চলাকালীন আপনি ব্যবহারকারীদের অ্যাপের থিম পরিবর্তন করতে দিতে পারেন। নিম্নলিখিত বিকল্পগুলি সাজেস্ট করা হয়েছে:
- লাইট
- ডার্ক
- সিস্টেম ডিফল্ট (সাজেস্ট করা ডিফল্ট বিকল্প)
এইসব বিকল্প সরাসরি AppCompat.DayNight মোডে ম্যাপ করা হয়:
লাইট:
MODE_NIGHT_NO.ডার্ক:
MODE_NIGHT_YES.সিস্টেম ডিফল্ট:
MODE_NIGHT_FOLLOW_SYSTEM.
থিম পরিবর্তন করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
API লেভেল ৩১ ও তার পরবর্তী ভার্সনে, আপনার অ্যাপ কোন থিমে চলে তা সিস্টেমকে জানাতে
UiModeManager#setApplicationNightModeব্যবহার করুন। এটি স্প্ল্যাশ স্ক্রিনের সময় সিস্টেমকে থিম ম্যাচ করতে দেয়।API লেভেল ৩০ ও তার নিচে, থিম পরিবর্তন করতে
AppCompatDelegate.setDefaultNightMode()ব্যবহার করুন।
ফোর্স ডার্ক
Android ১০-এ ফোর্স ডার্ক ফিচার আছে, যার সাহায্যে ডেভেলপাররা
DayNight থিম সেট না করেই দ্রুত ডার্ক থিম প্রয়োগ করতে পারেন।
'ফোর্স ডার্ক' আপনার লাইট-থিম অ্যাপের প্রতিটি ভিউ বিশ্লেষণ করে এবং স্ক্রিনে দেখানোর আগে অটোমেটিক ডার্ক থিম প্রয়োগ করে। ডার্ক থিম প্রয়োগ করার জন্য প্রয়োজনীয় সময় কমাতে আপনি ফোর্স ডার্ক এবং নেটিভ ইমপ্লিমেন্টেশন একসাথে ব্যবহার করতে পারেন।
অ্যাক্টিভিটির থিমে android:forceDarkAllowed="true" সেট করে অ্যাপকে অবশ্যই
'ফোর্স ডার্ক' বিকল্প চালু করতে হবে। এই অ্যাট্রিবিউটটি সিস্টেম- এবং
AndroidX-প্রদত্ত সমস্ত লাইট থিমে সেট করা আছে, যেমন Theme.Material.Light। আপনি যখন
'ফোর্স ডার্ক' ব্যবহার করেন, তখন আপনার অ্যাপটি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন এবং প্রয়োজন অনুযায়ী ভিউ বাদ দিন।
আপনার অ্যাপ যদি ডার্ক থিম ব্যবহার করে, যেমন Theme.Material), তাহলে 'ফোর্স ডার্ক'
প্রয়োগ করা হয় না। একইভাবে, আপনার অ্যাপের থিম DayNight থিম থেকে ইনহেরিট করলে, অটোমেটিক থিম পরিবর্তন হওয়ার কারণে'ফোর্স ডার্ক' প্রয়োগ করা হয় না।
কোনও ভিউতে 'ফোর্স ডার্ক' বন্ধ করুন
android:forceDarkAllowed লেআউট অ্যাট্রিবিউট বা
setForceDarkAllowed()-এর মাধ্যমে নির্দিষ্ট ভিউতে ফোর্স ডার্ক কন্ট্রোল করা যেতে পারে।
ওয়েব কন্টেন্ট
ওয়েব-ভিত্তিক কন্টেন্টে ডার্ক থিম ব্যবহার করার ব্যাপারে তথ্যের জন্য, WebView-তে ওয়েব কন্টেন্ট ডার্ক করা দেখুন। WebView-তে প্রয়োগ করা ডার্ক থিমের উদাহরণ দেখতে, GitHub-এ WebView ডেমো দেখুন ।
পেশাদার পদ্ধতি
নিম্নলিখিত বিভাগগুলি ডার্ক থিম প্রয়োগ করার জন্য পেশাদার পদ্ধতি প্রদান করে।
বিজ্ঞপ্তি ও উইজেট
ডিভাইসে দেখানো কিন্তু সরাসরি কন্ট্রোল করা যায় না এমন UI সারফেসের ক্ষেত্রে, আপনার ব্যবহার করা যেকোনও ভিউ যাতে হোস্ট অ্যাপের থিম দেখায় তা নিশ্চিত করুন। দুটি উদাহরণ হল বিজ্ঞপ্তি ও লঞ্চার উইজেট।
বিজ্ঞপ্তি
সিস্টেমের মাধ্যমে প্রদান করা বিজ্ঞপ্তির টেমপ্লেট ব্যবহার করুন, যেমন MessagingStyle। এর
অর্থ হল, সঠিক ভিউ স্টাইলিং প্রয়োগ করার দায়িত্ব সিস্টেমের।
উইজেট ও কাস্টম বিজ্ঞপ্তি ভিউ
লঞ্চার উইজেটের জন্য অথবা আপনার অ্যাপ কাস্টম বিজ্ঞপ্তি কন্টেন্ট ভিউ ব্যবহার করলে, লাইট ও ডার্ক থিম, দুটিতেই কন্টেন্ট পরীক্ষা করুন।
সাধারণত যেসব ভুল হয়ে থাকে সেগুলি নিচে উল্লেখ করা হল:
- ব্যাকগ্রাউন্ডের রঙ সবসময় হালকা হবে বলে ধরে নেওয়া হচ্ছে।
- টেক্সটের রঙ হার্ডকোড করা।
- ডিফল্ট টেক্সট কালার ব্যবহার করার সময় হার্ডকোড করা ব্যাকগ্রাউন্ড কালার সেট করা।
- একটি ড্রয়েবল আইকন ব্যবহার করা হচ্ছে যা একটি স্ট্যাটিক রঙ।
এইসব ক্ষেত্রে, হার্ডকোড করা রঙের পরিবর্তে উপযুক্ত থিম অ্যাট্রিবিউট ব্যবহার করুন।
লঞ্চ স্ক্রিন
আপনার অ্যাপে কাস্টম লঞ্চ স্ক্রিন থাকলে, বেছে নেওয়া থিম যাতে দেখা যায় তার জন্য আপনাকে এটি পরিবর্তন করতে হতে পারে।
ব্যাকগ্রাউন্ডের রঙ প্রোগ্রাম্যাটিকভাবে সাদা করার মতো হার্ডকোড করা রঙ সরিয়ে দিন। পরিবর্তে ?android:attr/colorBackground থিম অ্যাট্রিবিউট ব্যবহার করুন।
কনফিগারেশনে পরিবর্তন
সিস্টেম সেটিং বা AppCompat-এর মাধ্যমে অ্যাপের থিম পরিবর্তন করা হলে, এটি uiMode
কনফিগারেশন পরিবর্তন ট্রিগার করে। এর অর্থ হল, অ্যাক্টিভিটি অটোমেটিক আবার তৈরি করা হয়।
কিছু ক্ষেত্রে, আপনি হয়ত চাইবেন যে কোনও অ্যাপ কনফিগারেশন পরিবর্তন ম্যানেজ করুক। যেমন, কোনও ভিডিও চলছে বলে আপনি কনফিগারেশন পরিবর্তন করতে দেরি করতে চাইতে পারেন।
প্রতিটি Activity, uiMode কনফিগারেশন পরিবর্তন ম্যানেজ করতে পারে, এটি ঘোষণা করার মাধ্যমে
অ্যাপ ডার্ক থিম প্রয়োগ করা ম্যানেজ করতে পারে:
<activity
android:name=".MyActivity"
android:configChanges="uiMode" />
যখন কোনও Activity ঘোষণা করে যে এটি কনফিগারেশন পরিবর্তন ম্যানেজ করে, তখন থিম পরিবর্তন হলে এটির
onConfigurationChanged()
মেথড কল করা হয়।
বর্তমান থিম কী তা চেক করতে, অ্যাপ এই ধরনের কোড চালাতে পারে:
Kotlin
val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK when (currentNightMode) { Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme. Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme. }
জাভা
int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; switch (currentNightMode) { case Configuration.UI_MODE_NIGHT_NO: // Night mode is not active, we're using the light theme break; case Configuration.UI_MODE_NIGHT_YES: // Night mode is active, we're using dark theme break; }