วิธีการตั้งค่าแอพพลิเคชั่นทั้งหมดในโหมดแนวตั้งเท่านั้น?


201

ฉันจะตั้งค่าอย่างไรเพื่อให้แอปพลิเคชันทำงานในโหมดแนวตั้งเท่านั้น? ฉันต้องการให้โหมดแนวนอนถูกปิดใช้งานในขณะที่แอปพลิเคชันทำงานอยู่ ฉันจะเขียนโปรแกรมได้อย่างไร

คำตอบ:


293

สำหรับ Android ทุกรุ่น

จาก XML

คุณสามารถระบุandroid:screenOrientation="portrait"สำหรับแต่ละกิจกรรมในไฟล์ manifest.xml ของคุณ คุณไม่สามารถระบุตัวเลือกนี้บนapplicationแท็ก

จากจาวา

ตัวเลือกอื่น ๆ คือการเขียนโปรแกรมตัวอย่างเช่นในActivityคลาสฐาน:

@Override
public void onCreate(Bundle savedInstanceState) {
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

สำหรับ Android 4+ (API 14+)

ตัวเลือกสุดท้ายคือทำด้วยฟังวงจรชีวิตของกิจกรรมซึ่งมีให้ตั้งแต่ Android 4.0 (API 14+) เท่านั้น ทุกอย่างเกิดขึ้นในApplicationคลาสที่กำหนดเอง:

@Override
public void onCreate() {
    super.onCreate();  
    registerActivityLifecycleCallbacks(new ActivityLifecycleAdapter() {
        @Override
        public void onActivityCreated(Activity a, Bundle savedInstanceState) {
            a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    });
}

ActivityLifecycleAdapterเป็นเพียงคลาสผู้ช่วยที่คุณต้องสร้างซึ่งจะเป็นการใช้งานที่ว่างเปล่าของActivityLifecycleCallbacks(ดังนั้นคุณไม่จำเป็นต้องแทนที่แต่ละวิธีของส่วนต่อประสานนั้นเมื่อคุณต้องการเพียงหนึ่งในนั้น)


1
มันไม่ทำงาน. มันเปลี่ยนเป็นโหมดแนวนอนเมื่อฉันเปิดอุปกรณ์ และสิ่งอื่น ๆ ในรหัสฉันใช้ setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR เหล่านี้); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR); คำแนะนำสำหรับแถบความคืบหน้า มีปัญหากับคำแนะนำเหล่านี้หรือไม่
naresh

มันใช้งานได้ อีกสิ่งหนึ่งที่ไม่ได้ใส่สองคำแนะนำในส่วนการเข้ารหัสของคุณ มันหมายความว่ามันช่วยให้เซ็นเซอร์สำหรับการเปลี่ยนการวางแนวหน้าจอ
naresh

3
-1: ผู้ถามร้องขอวิธีการทำ // โดยทางโปรแกรม // และสำหรับแอปพลิเคชันทั้งหมด (ซึ่งทำให้ฉันเชื่อว่าพวกเขาไม่ต้องการทำสิ่งนั้นในแต่ละกิจกรรม)
jwir3

@ jwir3 ฉันไม่เห็นด้วย "การเขียนโปรแกรม" ไม่เพียง แต่เขียนรหัสโค้ด แต่ยังเป็นเมตาไฟล์ทั้งหมดทรัพยากรที่คุณใช้งานการแก้ไขไอดีของ IDE ฯลฯ นี่คือคำตอบที่ดีแก้ไขปัญหาและ OP ทำเครื่องหมายว่าถูกต้องเช่นเดิม เห็นได้ชัดว่าเป็นคำตอบที่เพียงพอสำหรับคำถามเดิม
James Webster

9
การใช้วิธี LifeCycleCallbacks คุณจะมีความล่าช้าในการเปิดตัวกิจกรรมเมื่อคุณถืออุปกรณ์ของคุณในโหมดแนวนอน (สิ่งที่ปกติจะเป็น) ฉันเดาว่าเป็นเพราะอุปกรณ์กลับสู่โหมดแนวนอนในช่วงสั้น ๆ ระหว่างกิจกรรมและต้องใช้เวลาในการจัดการสิ่งนี้ การตั้งค่าการวางแนวในรายการไม่มีผลกระทบนี้
ไม่ระบุชื่อ

142

ใช่คุณสามารถทำได้ทั้งแบบเป็นโปรแกรมและสำหรับกิจกรรมทั้งหมดของคุณที่ทำให้ AbstractActivity ที่กิจกรรมทั้งหมดของคุณขยายออกไป

public abstract class AbstractActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

กิจกรรมที่เป็นนามธรรมนี้ยังสามารถใช้สำหรับเมนูส่วนกลาง


3
หมายเหตุ: ฉันเชื่อว่าActivityInfo.SCREEN_ORIENTATION_NOSENSORควรเป็นคำตอบที่ดีกว่าเพราะมีวัตถุประสงค์เพื่อปล่อยให้อุปกรณ์อยู่ในสถานะเริ่มต้นเนื่องจากอุปกรณ์บางอย่างไม่มีแนวตั้ง อย่างไรก็ตาม 'nosensor' ใช้งานไม่ได้สำหรับฉันดังนั้นคำตอบของ @ arcone จึงเหมาะสำหรับฉัน
David Manpearl

104

คุณสามารถทำสิ่งนี้กับแอปพลิเคชันทั้งหมดของคุณโดยไม่ต้องทำให้กิจกรรมทั้งหมดของคุณขยายคลาสพื้นฐานทั่วไป

เคล็ดลับคือก่อนเพื่อให้แน่ใจว่าคุณรวมApplicationคลาสย่อยในโครงการของคุณ ในที่onCreate()เรียกว่าเมื่อแอปเริ่มขึ้นเป็นครั้งแรกคุณลงทะเบียนActivityLifecycleCallbacksวัตถุ (ระดับ API 14+) เพื่อรับการแจ้งเตือนของกิจกรรมระยะเวลากิจกรรม

สิ่งนี้จะให้โอกาสคุณในการรันโค้ดของคุณเองเมื่อใดก็ตามที่กิจกรรมใดๆ ในแอปของคุณเริ่มต้น (หรือหยุดหรือกลับมาทำงานต่อหรืออะไรก็ตาม) ณ จุดนี้คุณสามารถโทรหาsetRequestedOrientation()กิจกรรมที่สร้างขึ้นใหม่

class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();  

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, 
                                          Bundle savedInstanceState) {

                // new activity created; force its orientation to portrait
                activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            }

            ....

        });

    }
}

9
นี่เป็นคำตอบเดียวที่ตอบคำถาม บรรทัดเดียวที่จะปกครองพวกเขาทั้งหมด
ซามูเอล

2
* ชั้นหนึ่งที่จะปกครองพวกเขาทั้งหมด
Jay Mayu

3
และอย่าลืมเพิ่มลงในรูทแอปพลิเคชั่น android: name = ". MyApp"
Faisal Naseer

2
วิธีการนี้เรียกใช้ onCreate () ของกิจกรรมสองครั้ง
Sandeep R

3
ปัญหาคือเมื่อคุณถืออุปกรณ์ในแนวนอนและเริ่มกิจกรรมใหม่มันจะปรากฏขึ้นในแนวนอนแล้วหมุนเป็นแนวตั้ง ดูเหมือนว่าวิธีเดียวที่ดีในการล็อคแอพแบบเต็มในแนวตั้งคือการทำเครื่องหมายความเป็นเลิศทุกอย่างใน Manifest
Den

42

คุณสามารถตั้งค่านี้ในไฟล์รายการของคุณ ..

android:name=".your launching activity name"
android:screenOrientation="portrait"

และคุณยังสามารถบรรลุผลเดียวกันโดยการเขียนรหัสในไฟล์คลาสของคุณเช่น:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

1
@ naresh กรุณายอมรับ ans ถ้าหากคุณมีทางออกใด ๆ ตามความต้องการของคุณมันจะแข่งกับการให้คะแนนของคุณด้วย
SRam

24

เพิ่ม android: screenOrientation = "portrait" ให้กับกิจกรรมใน AndroidManifest.xml ตัวอย่างเช่น:

<activity android:name=".SomeActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait">

25
เขาบอกว่าแอปพลิเคชันไม่ใช่กิจกรรม
เพิ่มอีก

10

ใช้:

android:screenOrientation="portrait" 

เพียงเขียนบรรทัดนี้ในไฟล์รายการแอปพลิเคชันของคุณในแต่ละกิจกรรมที่คุณต้องการแสดงในโหมดแนวตั้งเท่านั้น


8

เขียนสิ่งนี้ลงในไฟล์ manifest ของคุณสำหรับทุกกิจกรรม:

android:screenOrientation="portrait" 

2

จากคู่มือนักพัฒนา Android:

"การวางแนว" การวางแนวหน้าจอมีการเปลี่ยนแปลง - ผู้ใช้หมุนอุปกรณ์ หมายเหตุ: หากแอปพลิเคชันของคุณกำหนดเป้าหมาย API ระดับ 13 ขึ้นไป (ตามที่ประกาศโดยแอ็ตทริบิวต์ minSdkVersion และ targetSdkVersion) ดังนั้นคุณควรประกาศการกำหนดค่า "screenSize" เนื่องจากจะเปลี่ยนเมื่ออุปกรณ์สลับระหว่างแนวตั้งและแนวนอน

"screenSize" ขนาดหน้าจอที่มีอยู่ในปัจจุบันมีการเปลี่ยนแปลง สิ่งนี้แสดงถึงการเปลี่ยนแปลงในขนาดที่มีอยู่ในปัจจุบันซึ่งสัมพันธ์กับอัตราส่วนภาพปัจจุบันดังนั้นจะเปลี่ยนเมื่อผู้ใช้สลับระหว่างแนวนอนและแนวตั้ง อย่างไรก็ตามหากแอปพลิเคชันของคุณกำหนดเป้าหมาย API ระดับ 12 หรือต่ำกว่ากิจกรรมของคุณจะจัดการกับการเปลี่ยนแปลงการกำหนดค่านี้เสมอ (การเปลี่ยนแปลงการกำหนดค่านี้จะไม่เริ่มกิจกรรมของคุณใหม่แม้ว่าจะทำงานบนอุปกรณ์ Android 3.2 หรือสูงกว่า) เพิ่มใน API ระดับ 13

ดังนั้นในไฟล์ AndroidManifest.xml เราสามารถใส่:

<activity
            android:name=".activities.role_activity.GeneralViewPagerActivity"
            android:label="@string/title_activity_general_view_pager"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            >
        </activity> 

1

การเพิ่ม<preference name="orientation" value="portrait" />ภายใต้<widget>ใน config.xml ทำงานได้สำหรับฉัน

(โซลูชันอื่นไม่ทำงานบนอุปกรณ์ของฉันถูกเขียนทับในระหว่างการสร้างหรือให้ข้อผิดพลาดในระหว่างกระบวนการสร้าง)


config.xml ที่กล่าวมาอยู่ที่ไหน คุณหมายถึงแพลตฟอร์มการพัฒนาอะไร
Tash Pemhiwa

1

ในไฟล์มานิเฟสต์ที่กิจกรรมที่คุณต้องการใช้ใน"แนวตั้ง"คุณต้องเขียนโค้ดเหล่านี้ในแท็กกิจกรรม

  android:screenOrientation="portrait" 

แบบนี้

         android:icon="@drawable/icon"
        android:name="com.zemkoapps.hd.wallpaper.AndroidGridLayoutActivity" 
        android:screenOrientation="portrait" >

แต่ถ้าหากคุณต้องการหน้าจอแนวนอนให้ใช้รหัสนี้เช่นนี้

android:screenOrientation="landscape"

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


    //setting screen orientation locked so it will be acting as potrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
}

0

หากมีคนสงสัยว่าคุณจะทำสิ่งนี้กับแอปพลิเคชันทั้งหมดได้อย่างไรโดยไม่ต้องทำให้กิจกรรมทั้งหมดของคุณขยายคลาสพื้นฐานทั่วไปในKotlinดูตัวอย่างด้านล่าง:

class InteractiveStoryApplication: Application() {
override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }

        override fun onActivityPaused(activity: Activity?) {
        }

        override fun onActivityResumed(activity: Activity?) {
        }

        override fun onActivityDestroyed(activity: Activity?) {
        }

        override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
        }

        override fun onActivityStarted(activity: Activity?) {
        }

        override fun onActivityStopped(activity: Activity?) {
        }
    })
}
}

และจากนั้นคุณต้องเพิ่มคลาสพื้นฐานของคุณใน AndroidManifest ดังนี้:

<application android:allowBackup="true"
android:name=".InteractiveStoryApplication"

0

คุณสามารถทำได้สองวิธี

  1. เพิ่ม android:screenOrientation="portrait"ไฟล์รายการของคุณไปยังกิจกรรมที่เกี่ยวข้อง
  2. เพิ่ม setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); ในกิจกรรมของคุณในวิธี `onCreate ()

0

คล้ายกับคำตอบของ Graham Borland ... แต่ดูเหมือนว่าคุณไม่จำเป็นต้องสร้างคลาสแอปพลิเคชันหากคุณไม่ต้องการ ... เพียงแค่สร้างกิจกรรมพื้นฐานในโครงการของคุณ

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_base);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

และขยายคลาสนี้แทน AppCompatActivity ซึ่งคุณต้องการใช้โหมด Potrait

public class your_activity extends BaseActivity {}

0

สำหรับผู้ใช้ Xamarin:

หากคุณขยายกิจกรรมทั้งหมดของคุณเป็นBaseActivityเพียงเพิ่ม:

this.RequestedOrientation = ScreenOrientation.Portrait;

วิธีนี้จะช่วยแก้ปัญหาได้ หากคุณต้องการกิจกรรมใด ๆ OnActivityCreatedที่จะอยู่ในการแทนที่ภูมิทัศน์นี้ เช่น:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;

-11

ในรายการของคุณพิมพ์สิ่งนี้:

<activity
    android:screenOrientation="portrait"
    <!--- Rest of your application information ---!>
</activity>

6
นี่ไม่ได้เพิ่มอะไรใหม่ที่คำตอบอายุ 3 ปียังไม่ได้พูด คุณอาจลองลบมัน หากคุณตัดสินใจที่จะแก้ไขคำตอบของคุณเพื่อรวมข้อมูลเพิ่มเติมที่แยกความแตกต่างคำตอบของคุณกับคนอื่น ๆ โปรด @ ตอบกลับถึงฉัน
Artjom B.

1
Android: screenOrientation = "portrait" ไม่สามารถเพิ่มไปยังแท็กแอปพลิเคชันได้จะต้องเข้าไปในแท็กกิจกรรม
Hossein Amini
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.