رسیدگی به تنظیمات چرخش صفحه نمایش

در این درس از دورهٔ جامع توسعهٔ اپلیکیشنهای اندروید، نحوهٔ مدیریت تغییرات جهت صفحه نمایش (Screen Orientation) در اکتیویتیها آموزش داده میشود. بهطور پیشفرض، تغییر جهت صفحه باعث بازسازی اکتیویتی و از دست رفتن دادهها میشود. برای جلوگیری از این مسئله، ابتدا ویژگی android:configChanges
در فایل AndroidManifest.xml
تنظیم میشود تا تغییرات جهت و اندازه صفحه نمایش کنترل شود. سپس، متد onConfigurationChanged
در اکتیویتی بازنویسی میشود تا به تغییرات جهت (افقی یا عمودی) واکنش دلخواه نشان دهد. این آموزش با ارائه کدهای عملی و توضیحات تخصصی به توسعهدهندگان کمک میکند تا رفتار اپلیکیشن خود را در مواجهه با تغییرات پیکربندی بهینهسازی کنند و تجربه کاربری بهتری ارائه دهند.
نوع خاصی از رویدادها در برنامه های اندروید وجود دارد، که به صورت اتوماتیک توسط فریم ورک برنامه تنظیم و کنترل میشوند. ولی خودتان هم میتوانید اونها رو در کد جاوا بصورت دستی تنظیم و دستکاری کنید. یکی از رایج ترین این رویدادها، رویداد configuration یا موقعیت نام دارد و یک نوع از رویداد configuration وقتی اتفاق میافتد که کاربر جهت دستگاهش را از حالت عمودی به افقی یا برعکس دربیارد. این رویداد به صورت اتوماتیک توسط فریم وورک برنامه کنترل میشود، در واقع اون اکتیویتی از مموری پاک میشود و مجدد از اول ساخته میشود.
بیایید یک نگاهی به این پروژه خیلی ساده با نام config Events بیندازیم.
من از قالب empty استفاده کردم و این کدی هست که قبلاً برای قسمت رویدادهای چرخه اکتیویتی نوشته بودم.
من متدهایی برای رویدادهایی شبیه به create، start، resume، pause و stop رو override کرده بودم.
و میدانید که می توانم از این برنامه روی یک دستگاه واقعی اجرا بگیرم.
حالا دارم با یک دستگاه واقعی که روی صفحه میبینید کار میکنم. من از طریق یک برنامه reflector این تصویر رو برای شما در اینجا روی صفحه نمایشم به تصویر میکشم.
و نشان تان میدهم که میتوانم برنامه رو از حالت عمودی به افقی و برعکس در بیارم.
حالا، بیایید ببینیم وقتی من اینکار رو میکنم چه اتفاقی در اندروید استودیو میافتد.
به پنجره Android Monitor ام میروم و با دابل کلیک بر روی اینجا expand یا توسعهاش میدهم تا بهتر بتوانیم اطلاعات داخلش را ببینیم.
و بعد، پیام ها رو با تگ Main Activity فیلتر میکنم.
و میبینیم که فقط دوبار تغییر در جهت صفحه نمایش که همین چند لحظه پیش انجام دادم، منجر به ایجاد همه این رویدادها شده. اول چند رویداد برای وقتی برنامه برای اولین بار استارت شده که در آموزش های ویدئویی قبلی با آنها آشنا شدید.
پس بطور معمول یک on Create داریم و یک on Start و یک on Resume.
ولی وقتی تغییر جهت از حالت عمودی به افقی داشتیم، رویداد on Pause و on Stop اجرا شدند.
و بعد یکبار دیگر یک on Create، on Start و on Resume.
و می بینید که وقتی برگشتم به حالت عمودی، همه اون دنباله رویداد؛ دوباره اتفاق افتادند. خب اینها حاکی از این هستند که بصورت از پیش تعریف شده وقتی تغییر جهت بصورت دستی داشتیم اکتیویتی جاری به طور کامل پاک میشود و از اول ساخته و نمایش داده میشود.
اینجا در این ویدئوی آموزشی به شما نشان میدهم که چطوری میتوانید یک مجموعه تغییرات configuration یا موقعیت از پیش تعریف شده سیستم عامل اندروید را کنترل و با ایده خودتان مرتب کنید.
قدم اول این است که تغییرات configuration ای که میخواهید کنترلش کنید و مد نظرتان هست را بصورت دستی، در فایل مانیفست برنامه ثبتش کنید.
میروم به فایل manifest ام، و میروم سراغ تعریف اکتیویتیای که دارم با آن کار میکنم. یعنی Main Activity.
و من یک ویژگی اینجا اضافه میکنم.
با کلمه config شروع میکنم، و بعد ویژگی config Changes رو انتخاب میکنم و یک لیست pop up از همه configuration changeهای در دسترس که ممکن است بخواهم با آنها کار کنم میبینم.
یکی برای screen size یا سایز صفحه، یکی برای orientation یا جهت صفحه، Font Scale، keyboard وغیره.
که فعلاً من میخواهم روی orientation یا جهت کار کنم.
پس انتخابش میکنم، ولی این کافی نیست. در ورژنهای اخیر اندروید، به کنترل رویداد screen Size بمعنی اندازه صفحه نمایش هم نیاز دارید. چون وقتی orientation یا جهت صفحه رو عوض میکنید، در واقع دارید سایز صفحه نمایش هم عوض میکنید و جای طول و عرض صفحه با هم عوض میشود.
برای کنترل دستی هر دوی این تغییر موقعیتها، یک کاراکتر pipe اضافه میکنم و کنترل اسپیس رو فشار میدهم تا دوباره لیست باز بشود و screen Size رو انتخاب میکنم.
بنابراین، عملیات لازم در فایل manifest انجام شد و به کلاس Main Activity ام میروم.
باید یک event handler یا تنظیم کننده رویداد دیگر اضافه کنم و باید یکبار دیگر یک فراخونی یا override از یک متد موجود داشته باشم.
کرسر رو بعد از متد on Create قرار میدهم و شروع میکنم به تایپ on Configuration. و میبینم که یک متد به نام on ConfigurationChanged وجود دارد و انتخابش میکنم. چند تا کد شرطی بعد از فراخوانی نسخه super classe از این متد اضافه میکنم.
از کلمه و دستور if استفاده میکنم و این عبارت را بکار میبرم. یک شی با نام new Config به عنوان آرگومان گرفته بودم. این یک شی پیچیده است با فیلدهای متعدد.
من مقدار new Config.orientation رو بکار میبرم.
توجه کنید که فیلدهای زیادی وجود دارد، مثل fontScale، keyboardHidden، locale، navigation و غیره. بنابراین حالا که داریم وضعیت جاری صفحه نمایش را کنترل میکنم، گزینه orientation رو انتخاب می کنم.
خب؛ حالا اون مقدار را با یک ثابت از کلاسی با نام Configuration مقایسه میکنم.
که از پکیج android.content.res در منابع هست.
و بعدش هم میآیم و با جهت ثابت ORIENTATION_PORTRAIT یا جهت عمودی مقایسهاش میکنم.
یعنی میگویم در صورتی که جهت صفحه نمایش عمودی بود؛ اگر این شرط true بود، یک پیام Toast ظاهر بشود و خروجی این پیام رشته Your orientation is portrait باشد بمعنی اینکه جهت صفحه نمایش شما عمودی هست و در قسمت else که میگوید اگر شرط TRUE برقرار نبود چه رویدادی رخ بدهد هم همین پیام را کپی میکنم و متنش رو به Your orientation is landscape تغییر میدهم بمعنی اینکه الان صفحه نمایش شما افقی شده و یک اینتر هم میزنم اینجاها تا یک خط اضافه بشود و خواندن این کدها تو صفحه راحتتر بشود و از کدم اجرا میگیرم.
وقتی برنامه برای بار اول بالا میاد، در حالت عمودی هست.
ولی حالا دستگاه رو میچرخانم و پیام Your orientation is landscape رو که چند لحظه پیش سفارشی کردم رو مشاهده میکنم.
یکبار دیگر جهت رو تغییر میدهم و پیام Your orientation is portrait رو میبینم.
فقط جهت یادآوری، میروم سراغ خروجی log cat ام و میبینم که دیگر اون پیامهایی که نشان میدادند اکتیویتی حذف شده و از اول ساخته شده، وجود ندارند. با کنترل کردن این فرآیند، با ثبت تغییرات جهتش در مانیفست و بعدش تنظیم دستی تغییراتش در کد جاوا تان، موقعیت اکتیویتی رو حفظ میکنید، حتی وقتی جهتش تغییر کند. در واقع وقتی به صورت دستی بیاییم تغییرات جهت صفحه نمایش را با اضافه کردن کدهایی در فایل مانیفست و کد جاوا کنترل کنیم، موقعیت اکتیویتی حفظ میشود و دیگر اکتیویتی در موقع تغییر جهت؛ خراب و از اول ساخته نمیشود.