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

در این جلسه به بررسی نحوه مدیریت چرخش صفحه نمایش یا به عبارتی چرخش اکتیویتی برنامه اندرویدی هنگام تغییر جهت قرارگیری دیوایس می‌پردازیم. یا به زبان ساده تر، غیر فعال کردن چرخش صفحه نمایش در برنامه اندرویدی از حالت عمودی (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 امتیاز)
پرسش‌ها و دیدگاه‌های کاربران
دوره آموزش برنامه نویسی اندروید
دوره آموزش برنامه نویسی اندروید

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

یک دیدگاه بنویسید

پرسش‌های زیر تایید و پاسخ داده نـــخواهند شد:
۱: جزء موارد مطرح شده در صفحات مشکلات و پرسش‌های رایج و بروزرسانی‌های محتوای آموزشی باشد
۲: سوال قبلا توسط کاربران در دیدگاه‌ها مطرح و پاسخ داده شده باشد
۳: پرسش خارج از مبحث آموزشی موجود در این صفحه باشد

  • حسین خبازان گفت:

    با سلام،
    من به راحتی با اضافه کردن android:screenOrientation=portrait در پوشه مانیفست، توانستم حالت چرخش افقی برنامه مورد علاقه‌ام را تبدیل به حالت ثابت عمودی کنم و مشکلم رفع شد.
    از ادمین سایت محترم «اندروید استودیو» بابت مطالب کاربردی و مفیدی که نشر داده‌اید سپاسگزارم.

  • سعيد کرمي گفت:

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

    • سیدمهدی مطهری گفت:

      سلام. ممنون از انتقادتون. نمیدونم بر چه اساسی من باید تماس بگیرم مشکلات فنی افراد رو رفع کنم. اینترنت و این همه فروم و وبسایت این وسط چیه پس؟ هیچ اصراری هم نداشتم. سوال پرسیدید جواب داده شد. اگه ایمیل رو هم جواب نمیدادم که الان انتقاد میکردید پیغام های ارسالی از طریق فرم تماس پاسخ داده نمیشه!
      مهم هم نیست که بخواید آموزشهای غیر رایگان رو بخرید یا نه. از آموزشهای رایگان استفاده کنید و لذت ببرید.
      موفق باشید

  • سعيد کرمي گفت:

    سلام. دوست عزیز با تشکر از زحمات شما:::
    من با وجودی که آموزش های شما رو چند بار مرور کردم ولی متوجه نشدم چرا
    نمی تونم شبیه ساز اندروید استودیو را کامل بکار ببرم.
    من اول مراحل نصب جنی موشن رو انجام دادم. ولی متوجه شدم سیستم من از VT
    پشتیبانی نمیکنه.
    من یه سیستم ایمیج از سایتهای ایرانی دانلود کردم و پس از اکسترکت در
    مسیر SDKimage-systemandroid کپی کردم. ولی به هیچ وجه چیزی در پنجره
    مجازی ساز اندروید استودیو نشون داده نمیشه. و چون چیزی هم نیست نمی تونم
    دانلود هم بکنم….
    اگه ممکنه با هم یه تماس تلفنی داشته باشیم و یا با نرم افزارهای کنترل
    از راه دور، سیستم من رو بررسی کنید…. هزینه هاشم بر روی چشم….. فقط
    از این وضعیت سردرگمی نجات پیدا کنم…. ممنون

    • سیدمهدی مطهری گفت:

      ممنون میشم سوالات رو در مبحث مربوطه مطرح کنید. این سوال شما مربوط به آموزش نصب جنی موشن هست. در خصوص مورد شما اون چیزی که اینجا ذکر کردید مسلما مسیری که فایل سیستم ایمیج رو گذاشتید اشتباه هست. اگر مبحث “نصب و راه اندازی اندروید استودیو” رو مطالعه کرده باشید اونجا مسیر قرار گرفتن سیستم ایمیج ها توضیح داده شده. البته این مبحث هفته قبل بروزرسانی شده اگه نسخه قدیم این آموزش رو دارید نسخه جدید رو مطالعه و دریافت کنید.
      https://android-studio.ir/?p=249

  • یونس گفت:

    خیلی عالی بود
    همینطور ادامه بدید اجرتون با صاحب الزمان

  • عبدالحمید ارجمند گفت:

    سلام ، اگه موافق بودید ، Exoplayerر و آموزش بدید. خیلی کاربرداره و قطعا که جایگزین اینای فعلی هست

  • عبدالحمید گفت:

    عالی بود ، لطفا آموزش چند زبانه کردن برنامه اندروید رو هم بزارید.