Android에서 화면 회전 방지


315

AsyncTask를 시작하기 때문에 회전하지 못하게하려는 활동 중 하나가 있으며 화면 회전으로 다시 시작됩니다.

이 활동을 알리는 방법이 있습니까? "사용자가 화를 내면서 전화를 흔들어도 화면을 회전시키지 마십시오"?



11
화면 방향 변경 AsyncTasks를 처리 할 수 ​​있습니다 . 화면 방향 변경을 방지하는 것은 게으른 해결 방법입니다. 방향 변경을 통해 AsyncTask를 유지하는 것은 어렵지 않습니다. :)
Romain Guy


56
"솔루션이 존재하고 어렵지 않다"고 주장하기보다는 솔루션이나 코드 Romain을 실제로 제공하는 것이 훨씬 도움이 될 것입니다.
Peter vdL

2
사용할 수 있습니다 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
mcy

답변:


467

더하다

android:screenOrientation="portrait" 

또는

 android:screenOrientation="landscape" 

<activity>매니페스트 의 요소에 대한 작업이 완료되었습니다.


95
앱에 버그가 숨겨져 있기 때문에 사용자가 버그를 극복 할 가능성이 줄어 듭니다. 그러나 그들은 여전히 ​​그렇습니다. 구성을 변경하면 활동이 다시 시작될 수 있습니다. 비동기 작업이 다시 시작될 때 처리하려면 실제로 활동을 올바르게 작성해야합니다.
hackbod

1
한 가지 경우에는 이것이 효과가 없었습니다. 앱을 열기 전에 화면을 가로로 설정했습니다. 앱을 열면 화면이 세로로 회전하여 asynctask를 두 번 호출했습니다.
user522559

2
"세로 모드로 열기" "항상 세로 모드로 유지 "로 설정해야합니다 . 1 만하는 것은 무의미합니다.
Carol

1
@hackbod에 관계없이,이에 대한 번호 # 1 구글 히트는 "안드로이드 응용 프로그램은 화면 회전을 방지,"내 필요가 비동기 작업과는 아무 상관이 없다
chiliNUT

7
@hackbod 그러면이 문제를 처리하기 위해 어떻게 활동을 올바르게 작성합니까?
user41805

127

당신은 자동 화면 회전을 방지하기 위해 아래의 논리를 따를 수 있는 동안 당신은 AsyncTask실행이다 :

  1. 를 사용하여 현재 화면 방향을 활동 내에 저장하십시오 getRequestedOrientation().
  2. 를 사용하여 자동 화면 방향을 비활성화하십시오 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR).
  3. 를 실행 / 실행하십시오 AsyncTask.
  4. 당신의 끝에서 AsyncTask사용하여 이전 방향 상태를 복원합니다 setRequestedOrientation(oldOrientation).

Activity내부 (UI 스레드에서 실행) 속성에 액세스 하는 방법에는 여러 가지가 있습니다 AsyncTask. AsyncTask내부 클래스로 구현하거나 클래스 Handler를 찌르는 메시지 를 사용할 수 있습니다 Activiy.


9
선택한 답변보다 훨씬 낫습니다.
Matej

3
좋은 생각 :) 현재 화면 방향을 저장하지 않은 경우 ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED를 사용할 수 있습니다
fligant

@emre, 감사합니다! " 정말 너무 좋아!" 이 문제에 대한 엄청난 토론을 주목하십시오 : stackoverflow.com/q/3821423/294884 ... 안드로이드 전문가, 여기에 단점이 있습니까?! 다시 감사합니다 .. 너무 많이.
Fattie

3
쓰레기!! 이 있지 않음 작업이 장치는 가로 모드를 시작하려면 발생합니다. 도대체!
Sux

@Emre,이 코드는 특정한 경우 작동하지 않습니다. 예를 들어 사용자가 AsyncTask의 시작과 끝 사이에서 방향을 변경 한 경우. 그러면 잘못된 방향을 저장하고 복원했을 것입니다.
Pacerier

27

매니페스트 파일에서 화면 회전을 잠 그려는 각 활동에 대해 가로 모드로 잠 그려면 다음을 추가하십시오.

<activity
        ...
        ...
        android:screenOrientation="landscape">

또는 세로 모드로 잠 그려면 다음을 수행하십시오.

<activity
            ...
            ...
            android:screenOrientation="portrait">

24

이 작업을 수행하는 가장 쉬운 방법은

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

바로 onCreate 내에서

setContentView(R.layout.activity_main);

그래서...

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

7

AndroidManifest에 들어 가지 않고 다음과 같이 할 수 있습니다.

screenOrientation = getResources().getConfiguration().orientation;
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
... AsyncTask

screenOrientation = getResources().getConfiguration().orientation;


@Override
protected void onPostExecute(String things) {
    context.setRequestedOrientation(PlayListFragment.screenOrientation);
    or 
    context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}

여기서 유일한 단점은 API 레벨 18 이상이 필요하다는 것입니다. 기본적으로 이것은 스피어의 끝입니다.


이 부분은 홈 및 최근 앱 버튼을 비활성화하고 있으며 SCREEN_ORIENTATION_FULL_SENSOR로 잠금을 해제 한 후에도 비활성화 된 상태입니다. Android N.
kamol

6

Activity.java

@Override     
 public void onConfigurationChanged(Configuration newConfig) {       
        try {     
            super.onConfigurationChanged(newConfig);      
            if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {      
                // land      
            } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {      
               // port       
            }    
        } catch (Exception ex) {       
     }   

AndroidManifest.xml

 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name="QRCodeActivity" android:label="@string/app_name"
  android:screenOrientation="landscape" >
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>

 </application>

2

AndroidManifest.xml의 ACTIVITY에 대한 다음 속성 만 있으면됩니다.

android:configChanges="orientation"

따라서 전체 활동 노드는 다음과 같습니다.

<activity android:name="Activity1"
          android:icon="@drawable/icon"
          android:label="App Name"
          android:excludeFromRecents="true"
          android:configChanges="orientation">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

1

더하다:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}

1

AndroidManifest.xml에 다음을 추가하십시오.

[앱> src> 메인> AndroidManifest.xml]

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

예:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx.zzzzzz.yyyyy">

   <uses-permission android:name="A-PERMISSION" />

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

</manifest>

0

ADT ( Android Developer Tools ) 및 Eclipse 를 사용하는 경우 AndroidManifest.xml-> 애플리케이션 탭->으로 이동하여 활동을 선택할 수 있습니다. 마지막으로 원하는 방향을 선택하십시오. 많은 옵션 중 하나를 선택할 수 있습니다.


0

manifest.xml 파일에 다음 코드를 추가해야합니다. 회전해서는 안되는 활동입니다. 해당 활동에서이 요소를 추가하십시오.

android:screenOrientation="portrait"

그런 다음 회전하지 않습니다.


0

이 방법으로 시도해 볼 수 있습니다

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itclanbd.spaceusers">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<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=".Login_Activity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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


0

화면 회전을 방지하는 것보다 앱을 빌드하는 더 좋은 방법 인 AsyncTask 를 사용하는 대신 활동이 변경 되어도 데이터를 안전하게 유지 하려면 AsyncTaskLoader 를 사용하십시오 .


0

화면 회전 방지는 다음 줄을 매니페스트에 추가하면됩니다.

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

이것은 나를 위해 작동합니다.


0

"portrait"AndroidManifest.xml 파일의 사용자 는 좋은 솔루션처럼 보일 수 있습니다. 그러나 특정 장치 (가로에서 가장 잘 작동)가 올바른 방향을 얻지 않고 세로로 이동하도록합니다. 최신 Android 버전에서는 오류가 발생합니다. 그래서 내 제안은 사용하는 것이 좋습니다 "nosensor".

<activity
        ...
        ...
        android:screenOrientation="nosensor">
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.