مدیریت و غیر فعال کردن چرخش صفحه نمایش

در این جلسه به بررسی نحوه مدیریت چرخش صفحه نمایش یا به عبارتی چرخش اکتیویتی برنامه اندرویدی هنگام تغییر جهت قرارگیری دیوایس می‌پردازیم. یا به زبان ساده تر، غیر فعال کردن چرخش صفحه نمایش در برنامه اندرویدی از حالت عمودی (Portrait) به افقی (Landscape) و بلعکس.

چرخش صفحه نمایش (اکتیویتی) برنامه اندرویدی

به نام خدا. حتما در کار با برنامه‌های موبایلی و بخصوص اندرویدی، با قابلیت چرخش صفحه نمایش هنگام چرخش و تغییر وضعیت دستگاه مواجه شده‌اید. هنگام چرخش موبایل یا تبلت توسط کاربر، وضعیت جدید دستگاه توسط سنسور تعبیه شده در آن تشخیص داده شده و سیستم عامل نیز وضعیت جهت صفحه نمایش و به عبارت دیگر، اکتیویتی در حال اجرای برنامه را بر اساس جهت قرار گیری دستگاه تغییر می‌دهد.

چرخش صفحه نمایش یا اکتیویتی در اندروید

به طور خلاصه، هنگامی که دستگاه در حالت افقی یا Landscape قرار گرفته باشد، اکتیویتی نیز به حالت افقی نمایش داده می‌شود. و همچنین هنگامی که دستگاه در حالت عمودی یا Portrait قرار گرفته باشد، اکتیویتی نیز به حالت عمودی نمایش داده می‌شود.

غیر فعال کردن چرخش صفحه نمایش

غیر فعال کردن چرخش صفحه نمایش (اکتیویتی) در برنامه نویسی اندروید

اما گاهی اوقات لازم است این قابلیت در برنامه و یا برخی از اکتیویتی‌های آن غیر فعال شده و اکتیویتی صرفا در یک حالت ثابت نمایش داده شود. از نمونه‌های بارز آن می‌توان به بازی‌های موبایلی اشاره کرد که غالباً در یک جهت ثابت تعریف شده‌اند و با چرخش دستگاه، جهت صفحه تغییر نمی‌کند.
بجز بازی‌ها در برخی دیگر از برنامه‌ها نیز بنا به ماهیت برنامه و محتویات آن ممکن است بخواهیم وضعیت اکتیویتی را در یک حالت مشخص قفل کنیم. برای مثال به اپلیکیشن‌های بانکی اشاره می‌کنم که عمدتا در حالت عمودی طراحی شده و با چرخش موبایل یا تبلت همچنان در حالت عمودی قرار دارند.
در مبحث آموزش تشخیص جهت صفحه نمایش دستگاه اندرویدی نحوه بررسی وضعیت فعلی صفحه نمایش پرداختیم. در این جلسه به نحوه غیر فعال کردن چرخش صفحه نمایش در اندروید و همچنین انواع روش‌ها و جزئیات آنها می‌پردازم.

پروژه مدیریت و غیر فعال کردن چرخش صفحه نمایش (اکتیویتی) در اندروید

می‌خواهیم مدیریت و همچنین غیر فعال کردن چرخش صفحه نمایش در اندروید را در قالب یک پروژه ساده بررسی کنیم.
طبق مبحث آموزش ساخت پروژه در اندروید استودیو یک پروژه اندرویدی با نام Manage Orientation می‌سازم. اکتیویتی را از نوع Empty Activity و زبان را Java انتخاب کردم.
برای غیر فعال کردن چرخش صفحه نمایش دو راه وجود دارد. در روش نخست در مانیفست پروژه یک ویژگی (attribute) به تگ اکتیویتی مربوطه اضافه می‌شود اما در روش دوم اینکار مستقیما درون اکتیویتی و در متد onCreate آن انجام می‌شود.
قبل از هر چیز پروژه را اجرا می‌کنم:

صفحه دستگاه اندرویدی در حالت عمودی یا Portrait

به طور پیش فرض، دیوایس در حالت عمودی قرار گرفته که صفحه نمایش و اکتیویتی نیز در همین وضعیت قرار دارد. حالا دستگاه را در وضعیت افقی قرار می‌دهم:

قرار دادن صفحه (اکتیویتی) اندرویدی در حالت افقی یا Landscape

ملاحظه می‌کنید اکتیویتی نیز مطابق با وضعیت دستگاه در حالت افقی قرار گرفته و یک چرخش ۹۰ درجه‌ای انجام شده است.
در ادامه مبحث با استفاده از دو روش، این چرخش را مدیریت و غیر فعال می‌کنیم.

روش اول: غیر فعال کردن چرخش اکتیویتی در مانیفست پروژه

در این روش صرفا با اضافه کردن ویژگی android:screenOrientation به تگ اکتیویتی مدنظر در فایل AndroidManifest.xml تعیین می‌کنیم وضعیت نمایش اکتیویتی روی چه حالتی باید ثابت شود؛ افقی یا عمودی. به کد زیر دقت کنید:

<activity android:name=".MainActivity"
    android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

برای اکتیویتی MainActivity ویژگی android:screenOrientation با مقدار portrait تعریف کردم. انتظار دارم با اجرای مجدد پروژه، اکتیویتی در حالت افقی دستگاه نیز به صورت portrait نمایش داده شود که با اجرای پروژه، نتیجه مطلوب گرفته می‌شود:

غیر فعال کردن چرخش صفحه نمایش دستگاه اندرویدی توسط ویژگی screenOrientation در مانیفست پروژه

طبیعتا انتظار داریم با تعریف مقدار landscape بجای portrait، اکتیویتی در هر دو حالت قرار گیری دستگاه به صورت افقی نمایش داده شود:

قرار دادن اکتیویتی در حالت افقی (Landscape) توسط screenOrientation

اما هنوز محدودیتی داریم به اینصورت که ثابت شدن وضعیت قرارگیری اکتیویتی فقط در جهت پیش فرض دیوایس انجام می‌شود. یعنی چنانچه مقدار landscape تعریف شود، اکتیویتی فقط در یک جهت افقی دستگاه ثابت می‌ماند و چنانچه کاربر دستگاه را ۱۸۰ درجه بچرخاند به طوری که دستگاه مجدد در حالت افقی قرار گیرد، اکتیویتی به صورت وارونه نمایش داده خواهد شد.
برای حل این مشکل لازم است بجای مقادیر portrait و landscape به ترتیب از sensorPortrait و sensorLandscape استفاده شود. به عبارتی پیشوند sensor به ابتدای مقادیر اضافه شده است. تفاوت این دو گزینه در تصویر زیر مشهود است:

تفاوت تعیین مقدار  landscape و sensorLandscape در screenOrientation

آیتم دیگری نیز وجود دارد که حالت افقی یا عمودی صفحه را می‌توان در جهت عکس حالت پیش فرض افقی یا عمودی دستگاه قرار داد. به عبارتی، صفحه را در وضعیت ۱۸۰ درجه‌ای نسبت به حالت افقی یا عمودی پیش فرض دستگاه قرار می‌دهد. برای اینکار از پیشوند reverse (به معنی معکوس) استفاده می‌کنیم؛ reversePortrait و reverseLandscape. البته بعید می‌دانم این گزینه کاربرد زیادی داشته باشد!
گزینه‌ دیگری که سیستم عامل اندروید در اختیار توسعه دهندگان قرار داده، آیتم‌های userPortrait و userLandscape هستند که از نام آن مشخص است نحوه قرار گیری حالت افقی یا عمودی را بر اساس تنظیماتی که کاربر روی دستگاه خود انجام داده تنظیم می‌شود. یعنی اینکه حالت افقی صفحه در جهت حالت افقی دستگاه باشد یا جهت عکس آن (چرخش ۱۸۰ درجه‌ای) به سلیقه کاربر بستگی خواهد داشت.

نکته: معمولا به طور پیش فرض در اکثر دستگاه‌های اندرویدی، userLandscape و userPortrait همان نقش sensorLandscape و sensorPortrait را ایفا می‌کنند.

روش دوم: غیر فعال کردن چرخش اکتیویتی توسط کد جاوا

در روش دوم، تعیین نحوه چرخش اکتیویتی به طور مستقیم درون خود اکتیویتی و متد onCreate آن انجام می‌شود. برای اینکار از متد setRequestedOrientation استفاده می‌کنیم:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

در کد فوق حالت SCREEN_ORIENTATION_SENSOR_LANDSCAPE تعیین شده که با حالت sensorLandscape تعریف شده در تگ اکتیویتی در مانیفست برابر است. سایر آیتم‌ها نیز مشابه آنچه قبلا توضیح دادیم در دسترس هستند:

غیر فعال کردن چرخش صفحه نمایش (اکتیویتی) در اندروید توسط متد setRequestedOrientation

MainActivity.java

package ir.android_studio.manageorientation;

import androidx.appcompat.app.AppCompatActivity;

import android.content.pm.ActivityInfo;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

    }
}

موفق و پیروز باشید.

مطالعه‌ی بیشتر:

https://developer.android.com/guide/topics/manifest/activity-element

توجه : سورس پروژه درون پوشه Exercises قرار دارد

دانلود نسخه PDF این آموزش به همراه سورس پروژه
تعداد صفحات : ۹
حجم : ۱ مگابایت
قیمت : رایگان
دانلود رایگان با حجم ۱ مگابایت لینک کمکی
این مطلب چقدر برایتان مفید بود؟ لطفا امتیاز دهید
4.2/5 - (12 امتیاز)
پرسش‌ها و دیدگاه‌های کاربران
دوره آموزش برنامه نویسی اندروید
دوره آموزش برنامه نویسی اندروید

با دریافت این دوره به تمامی آموزش‌های غیر رایگان و رایگان موجود در وب سایت دسترسی دارید که تخفیفی برای آموزش‌های غیر رایگان نیز درنظر گرفته شده. این پکیج به دو صورت دانلودی و ارسال پستی ارائه می‌گردد.
آموزش‌های اندروید استودیو در دو دسته «پایه» و «تکمیلی» منتشر می‌شوند.
آموزش‌های پایه شامل مباحث اصلی و ضروری و آموزش‌های تکمیلی مطالبی است که می‌بایست در کنار مطالب اصلی بررسی شود.
با خرید این دوره، به تمامی آموزش‌های غیر رایگانی که در آینده منتشر می‌شود نیز به صورت رایگان دسترسی خواهید داشت!