"세로"방향 모드 강제


298

내 응용 프로그램이 "가로"모드 용으로 설계되지 않았기 때문에 응용 프로그램에 "세로"모드를 적용하려고합니다.

일부 포럼을 읽은 후 매니페스트 파일에 다음 행을 추가했습니다.

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

그러나 내 장치 (HTC Desire)에서는 작동하지 않습니다. 매니페스트 파일의 줄을 무시하고 "세로"에서 "가로"로 전환합니다.

더 많은 포럼을 읽은 후 내 매니페스트 파일에 이것을 추가하려고했습니다.

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

내 활동 수업 에서이 기능 :

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

그러나 다시는 운이 없습니다.

답변:


531

오리엔테이션을 애플리케이션 요소에 적용하지 말고 대신 속성을 활동 요소에 적용 해야하며 configChanges아래 명시된대로 설정해야합니다 .

예:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

이것은 매니페스트 파일에 적용됩니다 AndroidManifest.xml.


26
구성 변경 사항은 무엇입니까?
Dror

71
@Orchestrator, configChanges는 구성 변경이 활동 자체에서 처리됨을 의미합니다. 이것이 없으면 방향 변경이있는 경우 활동이 다시 시작됩니다. 방향을 "세로"로 지정했다면 어떻게 바뀌겠습니까? 방향을 변경하는 다른 활동을 시작한 다음 새 활동이 종료되면 활동으로 돌아갈 수 있습니다. 예를 들어 Samsung Galaxy S3의 기본 이미지 캡처 의도는 특정 방향으로 수행됩니다.
Gordon McCreight

2
@GordonMcCreight, 실제 사례를 통해이를 설명해 주시겠습니까? "오리엔테이션이"세로 "라고 지정한 경우 어떻게 변경 될까요? 오리엔테이션을 변경하는 다른 활동을 시작하면 변경 될 수 있습니다. 새로운 활동이 종료되어 활동으로 돌아갑니다. "
Tushar Pandey

3
물론, @TusharPandey. 내가 정확하게 기억한다면, 이것이 우리를 슬프게 한 곳은 우리의 활동이 Samsung Galaxy S3에서 기본 이미지 캡처 의도를 시작했을 때였습니다. 기본적으로 사진을 찍고 결과를 얻고 싶었습니다. 그러나 카메라 의도가 반환되면 카메라를 보호 할 필요가 없었기 때문에 방향 변경으로 인해 활동 상태가 사라졌습니다 (전체 앱이 "세로"방향으로 만 제공됨). Galaxy S3가이를 수행하는 방법과 이유는 저의 (잘 알려진 제한적) 이해를 초월합니다.
Gordon McCreight

8
"keyboardHidden"이 포함 된 이유는 무엇입니까?
gonzobrains

24

참고

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

활동이 정의 된 매니페스트 파일에 추가됩니다.


13

android:screenOrientation="portrait"개인 활동에 사용할 수 있다고 생각 합니다. 따라서 <activity>다음과 같은 태그 에서 해당 속성을 사용하십시오 .

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

13

응용 프로그램에서 광산과 같은 활동이 많거나 매니페스트에 각 활동 태그의 코드를 입력하지 않으려는 경우이 작업을 수행 할 수 있습니다.

Application Base 클래스에서는 라이프 사이클 콜백을받습니다.

따라서 기본적으로 응용 프로그램 클래스에서 on create를 만들 때 각 활동에 대해 발생하는 것은 여기에서 트리거됩니다.

public class MyApplication extends Application{

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

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

이게 도움이 되길 바란다.


1
효율적인 답변! 특히 많은 수의 활동에 크게 의존하는 복잡한 앱을 개발하는 사람들에게는 정답이되어야합니다.
FEBRYAN ASA PERDANA

10

강제 세로 또는 가로 모드를 설정하고 각각 선을 추가하십시오.

아래 줄로 가져 오기 :

import android.content.pm.ActivityInfo;

바로 위 줄 아래에 추가 setContentView(R.layout.activity_main);

의 경우 세로 :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

대한 Landscap :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

이것은 확실히 작동합니다.


1
일부 기기에서는 Android 9에서 작동하지 않습니다. PORTRAIT
Igor Wojda

가능하면이 문제에 직면 한 장치 정보를 지정할 수 있습니까?
Parth Patel

4

안드로이드의 문서에 따르면 screenSize, 가능한 구성 변경을 포함해야하는 경우가 종종 있습니다.

android:configChanges="orientation|screenSize"

애플리케이션이 API 레벨 13 이상 (minSdkVersion 및 targetSdkVersion 속성으로 선언 된대로)을 대상으로하는 경우, 디바이스가 세로 방향과 가로 방향간에 전환 될 때 변경되기 때문에 "screenSize"구성도 선언해야합니다.

모든 값을 포함하는 경우 또한, keyboardHidden당신의 예제를, 당신은 다음도 생각 안 locale, mcc, fontScale, keyboard등? ..


3

내 AndroidManifest.xml 에이 줄이 있습니다.

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

내가 바꾼 것 (방금 추가 android:screenOrientation="portrait")

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

이것은 나를 위해 고정 된 것입니다.


2

보완해야 할 사항 : 최근에 앱을 업데이트했으며 이전 버전은 가로 및 세로 모드로 작동하고 업데이트 된 버전이 세로 모드에서 작동하기를 원하므로 추가했습니다.

android:screenOrientation="portrait"

해당 활동에 대한 업데이트를 테스트 할 때 충돌이 발생했습니다. 그런 다음 추가했습니다

android:configChanges="orientation|keyboardHidden"

또한 작동합니다.


1
이것이 질문에 대한 답변이 아닌 경우 의견이 도움이 될 수 있으므로 추가하는 것이 좋습니다.
JPReddy

응용 프로그램 차단이 아닌 활동에 추가
했는지 확인

1

android:configChanges="orientation|keyboardHidden"활동 에 추가하고 싶다고 생각 하십니까? 그렇지 않으면 config-change에서 활동이 다시 시작됩니다. 는 onConfigurationChanged, 단지를 다음 호출 할 수 없습니다 것onCreate


1

다른 방향 debugrelease빌드 를 지원하려면 작성하십시오 ( https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest 참조 ).

에서 build.gradle귀하의 app폴더에 쓰기 :

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

그런 다음 AndroidManifest이 변수 "orientation"을 다음에서 사용할 수 있습니다 Activity.

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

다음을 추가 할 수 있습니다 android:configChanges.

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]디버그 및 manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]릴리스에서

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />

-8

짧은 대답 : 하지 마십시오.

세로 및 가로 모드에서 모두 실행될 수 있도록 앱을 다시 디자인하십시오. 세로 및 가로 모두에서 작동하도록 디자인 할 수없는 UI와 같은 것은 없습니다. 게 으르거나 상상력이없는 개발자 만.

왜 간단한 이유입니다. 가능한 많은 기기에서 최대한 많은 사용자가 앱을 사용할 수 있기를 원합니다. 특정 화면 방향을 설정하면 해당 방향을 지원하지 않는 장치에서 앱이 실행되는 것을 막을 수 있으며 다른 방향을 선호하는 잠재 고객을 좌절시키고 소외시킬 수 있습니다.

예 : 세로 모드를 적용하도록 앱을 디자인합니다. 고객이 가로 모드에서 주로 사용하는 2-in-1 장치에서 앱을 다운로드합니다.
결과 1 : 앱을 사용할 수 없거나 고객이 기기를 도킹 해제하고 회전시킨 후 익숙하지 않거나 편안한 방향으로 사용해야합니다.
결과 2 : 고객이 앱의 직관적이지 않은 디자인으로 인해 좌절에 빠지고 대안을 찾거나 앱을 완전히 왜곡시킵니다.

나는 지금 앱으로 소비자와 싸우고 있으며 소비자와 개발자로서 나는 그것을 싫어합니다. 앱만큼이나 유용하고 기능이 제공하는 것만 큼 환상적이므로 앱을 사용하는 다른 모든 방식과 반대되는 방향을 사용하도록 강요하기 때문에 앱을 절대적으로 싫어합니다.

고객이 앱을 싫어하는 것을 원하지 않습니다.


나는 이것이 질문에 직접 대답하지 않는다는 것을 알고 있으므로 궁금한 사람들을 위해 조금 더 자세히 설명하고 싶습니다.

개발자가 코드 작성에 능숙하고 디자인에 끔찍한 경향이 있습니다. 이 질문은 코드 질문처럼 들리지만 asker는 확실히 코드 질문처럼 느껴지지만 실제로 디자인 질문입니다.

문제는 "앱에서 화면 방향을 잠 가야합니까?"입니다. asker는 UI를 디자인하고 세로 모드에서만 잘 보이도록 선택했습니다. 개발 시간을 절약하거나 앱의 워크 플로가 특히 세로 레이아웃 (모바일 게임에 공통적 임)에 도움이되기 때문이라고 생각합니다. 그러나 이러한 이유는 적절한 설계를 유발하는 모든 중요한 요소를 무시합니다.

  1. 고객 참여-고객이 앱에서 벗어나지 않고 앱에 빠져 들기를 원합니다. 앱은 고객이 앱을 열기 전에 무엇을 하든지 원활하게 전환해야합니다. (이것은 대부분의 플랫폼에 일관된 디자인 원칙이 있기 때문에 대부분의 앱은 필요하지는 않지만 다소 비슷하게 보입니다.)

  2. 고객 응답-고객이 앱에 긍정적으로 반응하기를 원합니다. 그들은 그것을 사용하는 것을 좋아해야합니다. 업무용 급여 앱인 경우에도 직원들이 앱을 열고 시계를 여는 것이 즐겁습니다.이 앱은 고객의 시간을 절약하고 대안에 대한 불만을 줄여줍니다. 사용자를 성가 시게하는 앱은 앱에 대한 분노를 심어 브랜드에 대한 분노를 자아냅니다.

  3. 고객 전환 – 고객이 탐색에서 상호 작용으로 쉽고 빠르게 이동할 수 있기를 바랍니다. 노출 수를 수익으로 전환하는 것이 모든 앱의 궁극적 인 목표입니다. (수익을 창출하지 않는 앱은 비즈니스 관점에서 구축하는 데 시간이 낭비됩니다.)

UI가 잘못 설계되면 고객 참여와 응답이 줄어들어 궁극적으로 수익이 줄어 듭니다. 모바일 중심 세계 (특히 세로 / 가로 표시 모드의 주제)에서 반응 형 웹 디자인이 그토록 중요한 이유를 설명합니다. Walmart Canada는 2013 년 11 월 웹 사이트에 반응 형 디자인을 도입 했으며 고객 전환율 이 20 % 증가했습니다. 오닐 의류 반응 형 웹 디자인 및 구현 iOS 장비를 사용하는 고객 매출이 증가 101.25 %를 , 그리고 591.42 % 고객의 안드로이드 장치를 사용 .

또한 개발자가 특정 솔루션 (예 : 디스플레이 방향 잠금)을 구현하는 데 집중하는 경향이 있으며이 사이트의 대부분의 개발자는 최상의 솔루션인지 여부에 대한 의문없이 해당 솔루션을 구현하는 데 너무 기뻐할 것입니다. 문제에 대한 해결책.

화면 방향을 잠그는 것은 do-while 루프를 구현하는 것과 동등한 UI 디자인입니다. 당신은 정말 당신이 그런 식으로하고 싶은, 또는 더 나은 대안이 있는지?

앱을 단일 디스플레이 모드로 설정하지 마십시오. 응답 할 수 있도록 추가 시간과 노력을 투자하십시오.


2
UI 디자인이 잘못되었다는 점을 이해하고 동의합니다. 그러나 그렇다고해서 그렇게해야한다는 사실은 바뀌지 않지만 프레임 워크에는 일반적으로 이러한 기능이 있어야합니다. 미래의 앱이 어떻게 될지 알 필요가 없으므로 질문은 여전히 ​​유효합니다.
Z. 쿨라

1
당신은 틀리지 않습니다. 필자는 불필요 하게이 작업을 수행하는 몇 가지 앱을 사용하여 경험을 완전히 망치는 좌절에 내 대답이 부분적으로 연료를 공급 받았다고 생각합니다. 디스플레이 모드를 잠그는 합법적 인 사례의 수는 무한대로 적습니다 (그리고 예산 내에서가 아니라 여전히 가능하고 바람직합니다). 이것은 다른 문제들을 생각 나게한다. 코드를 알고 있지만 UI 또는 디자인을 수행하는 방법을 배우지 않고 기본적인 모범 사례 (\ AppData-EWWWW에 설치되는 Java 앱)를 배우지 못하기 때문에 앱을 작성하는 아마추어 개발자가 많이 있습니다.
토마스

1
VR 앱을 만들고 있습니다. 안경이 마법을 발휘하려면 방향이 가로 방향이어야합니다. 세로 및 가로 모두에서 작동하도록 디자인 할 수없는 UI의 한 예입니다. 게임은 특정 방향을 강요해야 할 수도 있습니다. 나는 수많은 합법적 인 사건이 있다고 확신합니다.
Raslanove

1
StackExchange는 특정 질문에 답변하기 위해 존재하지만 답변이 다른 사람에게 유용 할 수 있도록 가능한 한 일반적으로 적용되도록 답변을 작성해야합니다 . 개발은 단순한 코드 작성 이상의 의미를 지니고 있으며 전 세계에 정크 응용 프로그램이 너무 많은 이유는 많은 개발자가이 중요한 원칙을 잊어 버리거나 배우지 않기 때문입니다. 개인적으로 전화로 VR을 수행하는 경우 VR을 잘못하고 있지만 비용은 VR을 지원하지 않는 플랫폼으로 VR에 대한 수요를 높였습니다.
토마스

1
이 답변에 동의하지 않지만 질문하지 않은 질문에 대한 답변입니다.
bmovement
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.