안드로이드에서 가로 모드를 비활성화하는 방법은 무엇입니까?


답변:


1632

android:screenOrientation="portrait"AndroidManifest.xml의 활동에 추가하십시오 . 예를 들면 다음과 같습니다.

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

편집 : 이것은 매우 인기있는 답변이되었으므로 초상화를 강요하는 것이 자주 적용되는 문제에 대한 올바른 해결책이 거의 없기 때문에 매우 죄책감을 느낍니다.
강제 인물 사진의 주요 경고 사항 :

  • 이것은 활동 라이프 사이클 이벤트 또는 올바르게 저장 / 복원 상태에 대해 생각할 필요가 없습니다. 앱 회전 외에 멀티 태스킹과 같은 피할 수없는 것들을 포함하여 활동 파괴 / 재생을 유발할 수있는 많은 것들이 있습니다. 바로 가기가 없습니다. 번들과 retainInstance조각 을 사용하는 법을 배웁니다 .
  • 상당히 균일 한 iPhone 환경과 달리, 세로가 분명하게 인기가없는 일부 장치가 있습니다. 사용자가 Nvidia Shield, Chromebook , foldables 또는 Samsung DeX 와 같은 하드웨어 키보드 또는 게임 패드가있는 기기를 사용하는 경우 인물 사진을 강제로 사용하면 앱 사용 환경이 제한적이거나 사용이 불편할 수 있습니다. 앱에 다른 방향을 지원하는 데 부정적인 경험을하게하는 강력한 UX 인수가없는 경우 가로 방향을 강요해서는 안됩니다. "고정 하드웨어 도크에 항상 사용되는 특정 태블릿 모델의 금전 등록기 앱"과 같은 것에 대해 이야기하고 있습니다.

따라서 대부분의 앱은 휴대 전화 센서, 소프트웨어 및 물리적 구성이 사용자가 앱과 상호 작용하려는 방식에 대한 자체 결정을 내릴 수 있도록해야합니다. 그러나 sensor사용 사례에서 기본 방향 동작에 만족하지 않는 경우 몇 가지 경우를 계속 생각할 수 있습니다.

  • 주된 관심사가 실수로 방향이 바뀌는 경우 장치의 센서와 소프트웨어가 잘 맞지 않는다고 생각하는 활동 (예 : 틸트 기반 게임)에서 가로와 세로는 지원하지만 nosensor방향은 사용 하는 것이 좋습니다. 이렇게하면 대부분의 태블릿에서 가로 및 세로로 표시되지만 대부분의 "일반"앱에서는 권장하지 않습니다 (일부 사용자는 전화기에서 가로 소프트 키보드를 입력하고 많은 태블릿 사용자는 세로로 읽습니다). 당신이 그들을 보자).
  • 이 경우 여전히 어떤 이유로 힘 초상화에 필요한, sensorPortrait보다 나은 수 있습니다 portrait안드로이드 2.3에 대한; 이렇게하면 거꾸로 된 인물 사진을 볼 수 있으며 태블릿 사용시 일반적입니다.

54
전체 앱에 대해 가능합니다. 이것을 확인하십시오 stackoverflow.com/a/9784269/1300707
Liam George Betsworth

1
sensorPortait라는 또 다른 초상화가 있음을 알았습니다. sensorPortait와 인물 사진의 차이점은 무엇입니까?
Jacky

1
Google의 문서 를 읽는 경우 : "세로 방향이지만 기기 센서에 따라 세로 또는 반대 세로가 될 수 있습니다. API 레벨 9에 추가되었습니다." 즉, "세로, 오른쪽 위 또는 거꾸로, 안드로이드 2.3 이상"입니다.
Yoni Samlan

2
아래 답변에서 언급했듯이 여러 문제를 해결하려면 "노 센서"가 더 나은 옵션 일 수 있습니다.
Mike Weir

1
동의하지 않는다고 말해야합니다. 모든 환경이 전화기의 가로 모드와 호환되는 것은 아니므로 센서가 아닌 UX가 결정하도록해야합니다. 그러나 태블릿에서는 그렇지 않습니다.
Renzo Tissoni

110

AndroidManifest.xml이 게시물을 읽을 때까지 파일 스위치를 알지 못했기 때문에 내 앱에서 대신 이것을 사용했습니다.

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     //  Fixed Portrait orientation

9
이렇게하면 장치가 지정된 방향이 아닌 경우 첫 번째로드에서 활동이 점프 할 수 있습니다.
Dori

나는이 방법을 사용하고 있었고 OnCreate에서 호출 한 다음 일부 자산 파일에서 데이터를 읽었습니다. 가로 방향으로 장치를 사용하여 앱을 시작하면 회전하지만 이상한 이유로 잘못된 초기화 자산을 읽게됩니다 (어떻게 회전이 끝날 때까지 기다려야 할 수도 있음). xml 대안을 사용해도이 문제가 발생하지 않았습니다.
Radu Simionescu

1
Android 프로그램의 시작 순서에 문제가있을 수 있습니다. setRequestedOrientation ()을 onResume ()으로 이동해 볼 수 있습니까 ???
Rich

45

다음 android:screenOrientation="portrait"과 같이 활동을 선언하는 매니페스트 파일에 이것을 추가하십시오.

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

자바 코드를 사용하려면

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

문의하기 전에 setContentView당신의 활동 방법을 onCreate().

이 도움이 되길 바랍니다.


29

여기에 많은 답변이 "portrait"AndroidManifest.xml 파일에서 사용하도록 제안 합니다. 이것은 좋은 솔루션처럼 보일 수 있지만 설명서에서 언급했듯이 가로 만있는 장치를 싱킹하고 있습니다. 또한 올바른 방향이 아닌 특정 장치 (가로에서 가장 잘 작동하는)가 세로로 들어가도록 강요하고 있습니다.

내 제안은 "nosensor"대신 사용하는 것입니다. 그러면 기기가 기본 선호 방향을 사용하고 Google Play의 구매 / 다운로드를 차단하지 않으며 센서가 (내 경우에는 NDK) 게임을 망칠 수 없습니다.


많은 사람들이 이것을 찬성 투표하고 있기 때문에, 인앱 화면 회전을 구현하려고 할 때 특정 모호한 장치가 실제로 예기치 않게 응답하기 때문에 "세로"를 제안하는 다른 답변과 함께 갔다는 것을 지적하고 싶습니다. 나중에 나에게 요구 사항. 또한 "세로"기능이있는 앱이 Google Play 설정에 의해 차단 될지 의심됩니다.
Mike Weir

Google Play는 실제로 가로 전용 기기에서 세로 전용 앱을 필터링합니다 . developer.android.com/guide/topics/manifest/… ( "귀하가 선언 한 값은 Google과 같은 서비스별로 필터링을 사용하도록 설정합니다. Play ")
miracle2k

14

매니페스트에 다음과 같이이 라인을 추가하십시오.

android : screenOrientation = "세로"

<manifest
    package="com.example.speedtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >


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

    </application>

</manifest>   

13

사용자 설정을 원한다면

그런 다음 추천합니다 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

설정 메뉴에서 설정을 변경할 수 있습니다.

타이머가 화면의 내용과 일치해야하기 때문에이 작업이 필요하며 화면을 회전하면 현재 활동이 파괴됩니다.


9

모든 활동을 공통 기본 클래스로 확장하지 않고도 전체 애플리케이션에 대해이를 수행 할 수 있습니다.

트릭은 먼저 프로젝트에 Application 서브 클래스를 포함시켜야합니다. 앱이 처음 시작될 때 호출되는 onCreate ()에서 ActivityLifecycle 이벤트 알림을 수신하기 위해 ActivityLifecycleCallbacks 객체 (API 레벨 14+)를 등록합니다.

이를 통해 앱의 활동이 시작 (또는 중지, 재개 또는 기타) 될 때마다 자신의 코드를 실행할 수 있습니다. 이 시점에서 새로 작성된 활동에 대해 setRequestedOrientation ()을 호출 할 수 있습니다.

매니페스트 파일에 app : name = ". MyApp"을 추가하는 것을 잊지 마십시오.

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);
            }
            ....
        });
    }
}

7

이것을 활동의 onCreate ()에서 사용하십시오.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

7

android:screenOrientation="sensorPortrait"AndroidManifest.xml에서 변경해야합니다


6

액티비티 태그에이 속성을 추가하기 만하면됩니다.

 android:screenOrientation="portrait"

6

활동의 각 매니페스트 항목에 방향을 추가하는 번거 로움을 피하고 싶지 않은 경우 'Activity'대신 'Activity'또는 'AppCompatActivity'를 상속하는 BaseActivity 클래스를 만듭니다. '또는'AppCompatActivity '를 선택하고 BaseActivity에 다음 코드를 추가하십시오.

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // rest of your code......
}

5

android:screenOrientation="portrait"가로 모드를 비활성화하려는 활동에 추가하십시오 .


5

사용 중지 Landscape mode for your android app(또는 단일 활동) 를 사용 중지 하려면 추가,

android:screenOrientation="portrait"AndroidManifest.xml파일 의 활동 태그에 .

처럼:

<activity android:name="YourActivityName" 
    android:icon="@drawable/ic_launcher" 
    android:label="Your App Name" 
    android:screenOrientation="portrait">

또 다른 방법은 프로그래밍 방식입니다.

프로그래밍 방식으로이 작업을 수행하려는 경우 Java 코드를 사용합니다. 가로 모드로 표시하지 않으려는 활동의 Java 클래스에 아래 코드를 추가하면됩니다.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

자세한 내용은 여기 에 링크 설명을 입력하십시오.


2
많은 답변들이 @Phoenix와 @Yoni의 좋은 충고와 모순되는 충고를하기 때문에, 좋은 결론은 그들이 제안하는 것을 반복하는 것이라고 생각합니다.android:screenOrientation="nosensor">
DSlomer64

1
@ DSlomer64 예. 태블릿 장치에 대처하려면 대신 nosensor 값을 세로 방향으로 사용해야합니다.
IntelliJ Amiya

5

일부보기에서 방향을 변경하는 방법

전체 활동의 방향을 잠그는 대신이 클래스를 사용하여 실제적으로 모든 뷰에서 방향을 동적으로 잠글 수 있습니다.

당신의 풍경을 조경하십시오

OrientationUtils.lockOrientationLandscape(mActivity);

세로 보기

OrientationUtils.lockOrientationPortrait(mActivity);

방향 잠금 해제

OrientationUtils.unlockOrientation(mActivity);

오리엔테이션 활용 수업

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Build;
import android.view.Surface;
import android.view.WindowManager;

/*  * This class is used to lock orientation of android app in nay android devices 
 */

public class OrientationUtils {
    private OrientationUtils() {
    }

    /** Locks the device window in landscape mode. */
    public static void lockOrientationLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }

    /** Locks the device window in portrait mode. */
    public static void lockOrientationPortrait(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    /** Locks the device window in actual screen mode. */
    public static void lockOrientation(Activity activity) {
        final int orientation = activity.getResources().getConfiguration().orientation;
        final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
                .getRotation();

        // Copied from Android docs, since we don't have these values in Froyo
        // 2.2
        int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
        int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

        // Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
        if (!(Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO)) {
            SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }

        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        } else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }

    /** Unlocks the device window in user defined screen mode. */
    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
    }

}

4

사용하다

android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait" 

4

각 활동의 방향을 설정해야합니다.

<activity
                android:name="com.example.SplashScreen2"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Registration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Verification"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.WelcomeAlmostDone"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.PasswordRegistration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>

4

oncreate () 메소드 내부에 클래스 추가

 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

4

Xamarin C #을 사용하는 경우 이러한 솔루션 중 일부가 작동하지 않습니다. 내가 찾은 해결책은 다음과 같습니다.

[Activity(MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = ScreenOrientation.Portrait)]

위의 클래스는 다른 솔루션과 마찬가지로 잘 작동하며 전역 적으로 적용 할 수 없으며 각 활동 헤더에 배치해야합니다.


4

manifest.xml에이를 작성하여 특정 활동이 항상 세로 모드로 유지되도록 할 수 있습니다.

 <activity android:name=".MainActivity"
        android:screenOrientation="portrait"></activity>

활동의 onCreate () 메소드에 다음 줄을 작성하여 활동이 postrait 모드로 유지되도록 할 수도 있습니다.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

3
<android . . . >
    . . .
    <manifest . . . >
        . . .
        <application>
            <activity android:name=".MyActivity" 
                android:screenOrientation="portrait" 
                android:configChanges="keyboardHidden|orientation">
            </activity>
        </application>
    </manifest>
</android>

3

프로젝트에 아래 표창을 추가하십시오.

npm 설치

npm 나는 반응 지향적 방향 로커

그런 다음 React_Native (프로젝트 폴더) / android / app / src / main / AndroidManifest.xml 과 같은 매니페스트 클래스를 사용합니다.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

<application
  android:name=".MainApplication"
  android:label="@string/app_name"
  android:icon="@mipmap/ic_launcher"
  android:allowBackup="false"
  android:theme="@style/AppTheme">
  <activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="landscape"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>
  <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>

감사합니다!


2

<apphome>/platform/android생성 된 디렉토리에서 (생성 된 디렉토리 AndroidManifest.xml에서 복사) 그런 다음 모든 활동 요소 에 android:screenOrientation=" portrait"를 추가하십시오 .


2
 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="in.co.nurture.bajajfinserv">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>


    <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" android:screenOrientation="portrait">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

속성 또는 android : screenOrientation을 사용하여 세로 또는 가로 모드에서 활동을 제한 할 수 있습니다.

내 프로그램에 둘 이상의 활동이있는 경우 어떤 모드에서든 활동 중 하나를 제한 할 수 있으며 원하지 않는 다른 활동에는 영향을 미치지 않습니다.


2

매니페스트 클래스 중 하나입니다.

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

또는 프로그래밍 방식으로

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

참고 :setContentView 의 활동을 하기 전에 메소드를 호출해야합니다 onCreate().


2

추가 android:screenOrientation="portrait"에서 의 AndroidManifest.xml 파일.

예를 들면 다음과 같습니다.

<activity android:name=".MapScreen" 
 android:screenOrientation="portrait"></activity>

1

다른 사람을 돕기 위해 AndroidManifest.xml의 ACTIVITY에 대한 다음 속성 만 있으면됩니다.

android : configChanges = "동향"

따라서 전체 활동 노드 :

<activity android:name="Activity1" 
    android:icon="@drawable/icon" 
    android:label="App Name" 
    android:configChanges="orientation">

답변이 너무 많으므로 더 많은 정보를 제공해야하며 왜 귀하의 정보를 사용해야합니까? 특히 문서에서는이 옵션을 사용하지 않는다고 말합니다. "참고 :이 속성을 사용하지 말아야하며 최후의 수단으로 만 사용해야합니다. 구성 변경으로 인해 다시 시작을 올바르게 처리하는 방법에 대한 자세한 내용은 런타임 변경 처리를 참조하십시오." developer.android.com/guide/topics/manifest/…
Murmel

1

kotlin에서는 아래를 사용하여 프로그래밍 방식으로 달성 할 수 있습니다

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

1

그것은 나를 위해 일했다 .AndroidManifest 파일 에이 코드를 추가하십시오.

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme">
        ....
        ....
        </application>

활동별로 설정할 필요가 없으므로 훌륭한 솔루션이었습니다. 불행히도 내 앱에서 작동하지 않습니다.
Myroslav Kolodii

1

당신의 매니페스트에 넣으십시오.

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="sensorPortrait" />

방향은 세로로 표시되지만 사용자 전화가 거꾸로되어 있으면 올바른 방법으로 표시됩니다. 따라서 화면이 180도 회전합니다.


활동이 다중 창 모드 에서 실행중인 경우 시스템 이 속성을 무시 합니다 .


0

활동이 첫 번째 장치 방향 상태와 관련된 경우 onCreate방법 에서 현재 장치 방향을 가져온 다음 영구적으로 수정하십시오.

        int deviceRotation = ((WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();

        if(deviceRotation == Surface.ROTATION_0) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_180)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_90)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        else if(deviceRotation == Surface.ROTATION_270)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.