تشخیص جهت (orientation) صفحه نمایش دستگاه اندرویدی

تشخیص جهت (orientation) صفحه نمایش دستگاه اندرویدی
در این جلسه از سری مباحث آموزش برنامه نویسی اندروید قصد داریم دو روش بدست آوردن جهت یا Orientation صفحه نمایش دستگاه‌های اندرویدی را بررسی کنیم. به این ترتیب می‌توانیم تشخیص دهیم صفحه نمایش در حالت عمودی (Portrait) قرار گرفته یا افقی (Landscape).

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

به نام خدا. در روند توسعه یک اپلیکیشن اندرویدی ممکن است در برخی مواقع لازم باشد عمل یا اعمالی بر اساس نحوه قرارگیری دستگاه انجام شوند. این عمل و تغییرات می‌تواند در رابط کاربری بوده و یا اینکه مربوط به عملکرد اصلی برنامه ما باشد.
برای تشخیص جهت قرارگیری صفحه نمایش به دو روش می‌توان عمل کرد که در ادامه و در قالب یک پروژه، هر دو روش را بررسی می‌کنیم. مطابق مبحث آموزش ساخت پروژه در اندروید استودیو یک پروژه اندرویدی با نام Orientation می‌سازم. اکتیویتی را از نوع Empty Activity و زبان را Java انتخاب کردم.
ابتدا دو TextView در layout اکتیویتی تعریف می‌کنم تا خروجی هر دو روش را نمایش دهد:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/txt_one"
        android:textSize="30dp"
        android:text="" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/txt_two"
        android:textSize="30dp"
        android:text=""
        android:layout_below="@id/txt_one" />

</RelativeLayout>

روش اول تشخیص جهت صفحه نمایش

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

MainActivity.java

package ir.android_studio.orientation;

import androidx.appcompat.app.AppCompatActivity;

import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView txtOne, txtTwo;

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

        txtOne = findViewById(R.id.txt_one);
        txtTwo = findViewById(R.id.txt_two);

        int screenOrientation = this.getResources().getConfiguration().orientation;

        if (screenOrientation == Configuration.ORIENTATION_LANDSCAPE) {
            txtOne.setText("Landscape");
        } else {
            txtOne.setText("Portrait");
        }

    }
}

یک متغیر با نام دلخواه screenOrientation و از جنس int تعریف کردم که orientation فعلی صفحه را در خود ذخیره می‌کند:

int screenOrientation = this.getResources().getConfiguration().orientation;

عدد ذخیره شده در متغیر فوق، عدد ۱ یا ۲ خواهد بود که عدد ۱ نشانه وضعیت Portrait و عدد ۲ نشانه وضعیت Landscape است. سپس یک شرط تعریف شده که بررسی می‌کند چنانچه مقدار ذخیره شده در این متغیر با Configuration.ORIENTATION_LANDSCAPE برابر باشد (به عبارتی عدد ۲ ذخیره شده باشد) قسمت اول شرط و در غیر اینصورت قسمت دوم شرط اجرا شود. بدیهی است چنانچه از Configuration.ORIENTATION_PORTRAIT استفاده می‌کردم خروجی شرط بلعکس می‌شد. کانتکست را this قرار داده‌ام.
پروژه را اجرا می‌کنم:

تشخیص جهت صفحه نمایش دستگاه اندرویدی توسط کلاس Configuration

در ابتدای اجرای شبیه ساز Genymotion صفحه نمایش در حالت عمودی قرار دارد و خروجی شرط که در TextView نمایش داده شده با وضعیت دستگاه همخوانی داشته و عبارت Portrait را نمایش می‌دهد. حالا دستگاه را در حالت افقی قرار می‌دهم:

تشخیص جهت صفحه نمایش دستگاه اندرویدی توسط کلاس Configuration در حالت افقی یا Landscape

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

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

در این قسمت از resource پروژه برای تشخیص وضعیت صفحه نمایش استفاده می‌کنیم. روی فولدر res پروژه راست کلیک کرده و Android Resource File را انتخاب می‌کنم:

تشخیص جهت صفحه نمایش دستگاه اندرویدی توسط resource پروژه (xml)

نام فایل را layouts وارد کرده و در قسمت Directory name مطابق تصویر فوق، values-land می‌نویسم. از آنجایی که نام این دایرکتوری به land ختم شده، محتویات داخل آن در صورتی در دسترس خواهد بود که وضعیت صفحه نمایش در حالت Landscape قرار گرفته باشد. پس از ایجاد فایل layouts.xml آنرا به صورت زیر تکمیل می‌کنم:

values-land/layouts.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_landscape">true</bool>
</resources>

در این فایل یک ویژگی از جنس bool (مخفف boolean) تعریف کردم با نام دلخواه is_landscape و مقدار true. مجدد یک فایل دیگر به همین شیوه و با همان نام layouts.xml اما اینبار در دایرکتوری values-port ایجاد می‌کنم:

values-port/layouts.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_landscape">false</bool>
</resources>

در این فایل هم یک ویژگی با نام is_landscape تعریف کردم با این تفاوت که مقدار آن false است. این دو فایل در محیط پروژه به اینصورت نمایش داده می‌شود:

فایل layouts.xml در دایرکتوری‌های layout-land و layout-port

حالا در اکتیویتی یک متغیر از جنس boolean تعریف می‌کنم:

boolean isLandscape = this.getResources().getBoolean(R.bool.is_landscape);

توسط کد فوق، مقدار ویژگی bool با نام is_landscape از layouts.xml ای که با توجه به وضعیت صفحه نمایش در دسترس است، در متغیر isLandscape ذخیره می‌شود. یعنی چنانچه صفحه نمایش در حالت افقی قرار داشته باشد، layouts.xml دایرکتوری values-land در دسترس خواهد بود در نتیجه مقدار true را برمی‌گرداند و همینطور برای حالت عمودی مقدار false. در نهایت شرطی را برای بررسی خروجی این متغیر مانند قسمت قبل تعریف می‌کنم:

if (isLandscape) {
    txtTwo.setText("Landscape");
} else {
    txtTwo.setText("Portrait");
}

مجدد پروژه را اجرا می‌کنم:

تشخیص جهت (orientation) صفحه نمایش دستگاه اندرویدی توسط layouts.xml

تشخیص جهت (orientation) صفحه نمایش دستگاه اندرویدی توسط layouts.xml

ملاحظه می‌کنید خروجی هردو روش بر اساس افقی یا عمودی بودن دستگاه بروز می‌شود.
کد کامل اکتیویتی:

MainActivity.java

package ir.android_studio.orientation;

import androidx.appcompat.app.AppCompatActivity;

import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView txtOne, txtTwo;

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

        txtOne = findViewById(R.id.txt_one);
        txtTwo = findViewById(R.id.txt_two);

        int screenOrientation = this.getResources().getConfiguration().orientation;

        if (screenOrientation == Configuration.ORIENTATION_LANDSCAPE) {
            txtOne.setText("Landscape");
        } else {
            txtOne.setText("Portrait");
        }

        boolean isLandscape = this.getResources().getBoolean(R.bool.is_landscape);

        if (isLandscape) {
            txtTwo.setText("Landscape");
        } else {
            txtTwo.setText("Portrait");
        }

    }
}

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

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

https://developer.android.com/reference/android/content/res/Configuration

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

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

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

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

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