Android 활동이 항상 가로 모드를 사용하도록 강제


144

HTC G1 에서 Android VNC 뷰어를 사용하고 있습니다. 그러나 어떤 이유로 든 G1이 세로 모드에 있지만 해당 응용 프로그램은 항상 가로 모드에 있습니다. 안드로이드 VNC 뷰어는 오픈 소스이므로 활동을 '가로'로 하드 코딩하는 것이 어떻게 가능한지 알고 싶습니다. 전화 방향을 존중하도록 변경하고 싶습니다.

답변:


188

9 번 라인 에서 AndroidManifest.xml ( link )을 살펴보십시오 .

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">

이 줄 screenOrientation은 가로를 지정 하지만 작성자는로 화면 방향 변경을 재정의합니다 configChanges="orientation|keyboardHidden". 이것은 VncCanvasActivity.java에서 재정의 된 함수를 가리 킵니다.

VncCanvasActivity를 살펴보면 109 행에 재정의 된 함수가 있습니다.

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // ignore orientation/keyboard change
  super.onConfigurationChanged(newConfig);
}

저자는 특별히 키보드 나 방향 변경을 무시하기 위해 주석을 달았습니다.


이를 변경하려면 위에 표시된 AndroidManifest.xml 파일로 돌아가서 행을 다음과 같이 변경하십시오.

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">

사용자가 장치를 회전 할 때 세로에서 가로로 전환되도록 프로그램을 변경해야합니다.

이것은 작동 할 수 있지만 레이아웃이 작성된 방식에 따라 GUI의 모양이 엉망이 될 수 있습니다. 당신은 그것을 설명해야합니다. 또한 활동이 코딩되는 방식에 따라 화면 방향이 변경되면 입력 상자에 채워진 값이 사라지는 것을 알 수 있습니다. 또한 처리해야 할 수도 있습니다.


3
configChanges속성이 꼭 필요한가요? 키보드가 아닌 전화기에서 작동하는 것 같습니다. 어떤 상황에서 방향을 세로 방향으로 변경 screenOrientation="landscape"하면 configChanges?
Timmmm


가로 또는 세로에서만 시스템 이미지 선택 라이브러리와 같은 내장 활동을 강제하는 방법은 무엇입니까?
Jacky

118

Java 코드에서도 동일한 데이터를 설정할 수 있습니다.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ActivityInfo의 다른 값을 사용하면 센서 구동 또는 잠금 초상화로 다시 설정할 수 있습니다. 개인적으로, 나는이 질문에 대한 또 다른 대답에서 제안 된대로 Manifest의 무언가로 설정하고 나중에 필요한 경우 Android SDK에서 위의 호출을 사용하여 변경하고 싶습니다.


@Yegor 항상 그런 것은 아닙니다. 안드로이드 문서에서 :If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Chaitanya

40

OnCreate(Bundle)에서는 일반적으로 다음을 수행합니다.

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
다른 답변의 매니페스트 방법은 작동하지 않는 것 같지만 @anwarma는 너의 것
Anup

31

매니페스트에서 활동 방향을 지정할 수 있습니다. 여기를 참조 하십시오 .

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  

24

매니페스트에서 :

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

당신의 활동에서 :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);

11

다음은 가로 모드에서 모든 활동을 표시하는 데 사용한 코드입니다.

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>

2
응용 프로그램 목표의 API 레벨 13은 높은 당신은 또한 "화면 크기"선언해야하는 경우 "오리엔테이션"
미나 Fawzy

7

빠르고 간단한 해결책은 AndroidManifest.xml 파일을위한 것입니다. 가로 모드로 설정하려는 각 활동에 대해 다음을 추가하십시오.

android:screenOrientation="landscape"

5

이것은 Xamarin.Android에서 작동합니다. OnCreate ()에서

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;

4

그게 다야 !! 이 수정 사항을 기다리는 중입니다.

(프로그래밍 방식으로) 가로 모드가 필요한 활동을 두 번 시작하는 것에 대한 오래된 Android 문제가 있습니다. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

이제 Android는 시작시 가로 모드를 만듭니다.


3

Arslan, 왜 명시 적으로 방법이 있지만 문법적으로 방향을 문법적으로 강제하고 싶습니까? <activity android:name=".youractivityName" android:screenOrientation="portrait" />


메신저는 아니지만 특정 시간에 강제로 프로그래밍하기를 원할 수도 있습니다.
Hamzah Malik

1

코드로 작성하는 것은 IMO 잘못이며 onCreate에 넣으면 훨씬 더 그렇습니다. 매니페스트에서이 작업을 수행하면 "시스템"은 앱 시작시 방향을 알고 있습니다. 그리고 이러한 유형의 메타 또는 최상위 "지침"이 명시 적이어야합니다. 스스로 그것을 증명하고 싶다면 활동의 onCreate에서 휴식을 설정하십시오. 코드로 작성하면 두 번 호출됩니다. 세로 모드에서 시작한 다음 가로로 전환됩니다. 매니페스트에서 수행하면 발생하지 않습니다.


1
동의하지 않습니다. 매니페스트를 통한 것이 아니라 코드에서 무엇이든하는 것이 항상 선호되는 방법입니다. 단일 책임 원칙에 따라 매니페스트는 응용 프로그램 수준 속성, 권한 및 API 바인딩에만 관련되어야합니다. 실제로 <activity> 태그가 응용 프로그램 매니페스트에 전혀 존재하지 않기 때문에 거기에 넣지 않습니다 (그리고 잘 작동합니다). 활동이 어떻게 표현되는지는 분명히 프레젠테이션 문제입니다. 귀하의 활동은 그것이 제시되는 방식에 전적으로 책임을 져야하므로 일반적으로 모든 프레젠테이션 논리를보기 / 활동 코드에 넣습니다.
ComeIn

0

내용은 안드로이드 4.0 (아이스크림 샌드위치) 이상, 나는 외에, 다음을 추가하는 데 필요한 landscape값.

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

keyboardHidden|orientation전원 버튼을 누를 때만 계속 사용하면 메모리 누수가 발생하고 활동이 재현됩니다.


나쁜 연습 경고! 가로 모드에서 액티비티를 강제하는 것과는 아무런 관련이 없습니다. 항상 활동 상태의 저장 및 재생을 구현해야합니다. 그것은 기본적인 안드로이드 개발 지식입니다. 이 해키 수정으로 해결하지 마십시오. 더 많은 메모리가 필요한 경우 시스템에서 활동을 항상 닫을 수 있습니다.
Roel

@Roel, 예를 들어 장치를 회전 할 때 활동이 세로로 다시 회전하는 것을 방지하는 유일한 방법입니다. 이러한 구성 변경이 활동에 영향을 미치지 않도록합니다.
Peterdk

약간 심술 message은 메시지에 대해 유감이지만 메시지를 테스트했으며 가로 모드에 대해 이러한 값을 모두 사용하지는 않습니다. 이러한 모든 값을 추가하면 액티비티가 방금 다시 시작되는 대신 (구성을 구현해야 함) 대신 onConfigurationChanged ()에서 변경 사항을 직접 처리하지만 랜드 스케이프를 강제 실행하면 회전이 발생하지 않습니다.
Roel

안녕, 그들 중 일부는 필요하지 않을 수 있지만, 모두 생략하면 이상한 회전 문제가 발생합니다. 지금 테스트 할 수는 없지만 항상 가로 방향이어야하는 앱을 개발할 때 사용하는 것만으로 orientation|screensize는 충분하지 않았습니다. 다시 세로로 자동 회전합니다.
Peterdk

이러한 구성 변경은 Google 모바일 광고 및 기타 광고 SDK에서도 사용됩니다. 그 당시 내가 그들을 얻은 곳입니다.
Peterdk

0

이와 같이 setLayout 메소드를 호출하기 전에 onCreate 메소드에서 ActivityInfo (android.content.pm.ActivityInfo)를 사용하십시오.

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


0

활동에 다음 줄 추가

모든 활동에 참여해야합니다

풍경을 위해

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

초상화

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

여기 MainActivity의 예

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <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="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

-25

CTRL+F11화면을 회전 시키려면을 누르십시오 .


3
이제 화면 회전 방법이 아니라 앱의 기본 방향을 설정하는 방법을 원합니다.
kyle k

에뮬레이터의 경우 CTRL + f12
Lazy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.