การเปลี่ยนทิศทางหน้าจอ (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" → กลับเป็นแนวตั้ง