Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีเปลี่ยน Screen Orientation ด้วยปุ่มใน Android

การเปลี่ยนทิศทางหน้าจอ (Portrait/Landscape) โดยโปรแกรมผ่านปุ่มกด

ตัวอย่างนี้แสดงวิธีใช้ setRequestedOrientation() กับ ActivityInfo เพื่อบังคับให้หน้าจอหมุนเป็น Portrait หรือ Landscape เมื่อกดปุ่ม

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

Android Studio → File → New Project → กรอกรายละเอียด → Finish

ขั้นตอนที่ 2: Layout - res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/buttonSetPortrait"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ตั้งค่าเป็น Portrait"
        android:textColor="@color/colorPrimaryDark"
        android:textStyle="bold"
        android:layout_marginTop="62dp"
        android:layout_centerHorizontal="true" />
    <Button
        android:id="@+id/buttonSetLandscape"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ตั้งค่าเป็น Landscape"
        android:textColor="@color/colorPrimaryDark"
        android:textStyle="bold"
        android:layout_below="@id/buttonSetPortrait"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp" />
</RelativeLayout>

ขั้นตอนที่ 3: MainActivity.java

package app.com.sample;

import android.content.pm.ActivityInfo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btnPortrait = findViewById(R.id.buttonSetPortrait);
        Button btnLandscape = findViewById(R.id.buttonSetLandscape);

        btnPortrait.setOnClickListener(v -> 
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
        );

        btnLandscape.setOnClickListener(v -> 
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
        );
    }
}

ขั้นตอนที่ 4: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

ค่าคงที่ Screen Orientation ทั้งหมด

Constantคำอธิบาย
SCREEN_ORIENTATION_PORTRAITแนวตั้ง (Portrait)
SCREEN_ORIENTATION_LANDSCAPEแนวนอน (Landscape)
SCREEN_ORIENTATION_SENSORตาม Sensor (Auto-rotate)
SCREEN_ORIENTATION_SENSOR_PORTRAITแนวตั้ง ตาม Sensor (กลับหัวได้)
SCREEN_ORIENTATION_SENSOR_LANDSCAPEแนวนอน ตาม Sensor (กลับหัวได้)
SCREEN_ORIENTATION_REVERSE_PORTRAITแนวตั้ง กลับหัว (Upside down)
SCREEN_ORIENTATION_REVERSE_LANDSCAPEแนวนอน กลับหัว
SCREEN_ORIENTATION_FULL_SENSORทิศทางทั้ง 4 ด้านตาม Sensor
SCREEN_ORIENTATION_USERตามการตั้งค่าของผู้ใช้
SCREEN_ORIENTATION_LOCKEDล็อกทิศทางปัจจุบัน (API 18+)
SCREEN_ORIENTATION_UNSPECIFIEDค่าเริ่มต้น (ตาม Manifest)

ตั้งค่าใน Manifest (Static)

<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait" > <!-- หรือ landscape, sensor, user, locked -->
    ...>
</activity>

การจัดการ Configuration Change

เมื่อหมุนหน้าจอ Activity จะ Recreate (onDestroy → onCreate) ถ้าต้องการจัดการเอง:

<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
    ...>
</activity>
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // จัดการ Layout เอง ไม่ recreate Activity
}

⚠️ ข้อควรระวัง

  • setRequestedOrientation() จะทำให้ Activity Recreate (เรียก Lifecycle ใหม่)
  • ควร Save/Restore Instance State (onSaveInstanceState) เพื่อไม่สูญเสียข้อมูล
  • บาง Device/Launcher อาจบล็อกการหมุนบังคับ
  • ใช้ Sensor-based orientation เพื่อเคารพการตั้งค่า Auto-rotate ของผู้ใช้

การทดสอบ

รันแอป → กด "ตั้งค่าเป็น Landscape" → หน้าจอหมุนเป็นแนวนอน → กด "ตั้งค่าเป็น Portrait" → กลับเป็นแนวตั้ง