방향이 변경 될 때 응용 프로그램을 다시로드하지 마십시오


152

화면이 회전 할 때 변경할 필요가 없습니다. 내 앱은 처음로드 할 때 임의의 이미지를 표시하고 장치를 회전하면 다른 임의의 이미지를 선택 해서는 안됩니다 . 이 동작을 어떻게 중단시킬 수 있습니까?


1
코드에서 화면 방향을 잠 그거나 잠금 해제 할 수도 있습니다. github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/…Screen.lockOrientation(this) 에서 전화 하십시오. 매니페스트가하지 않는 잠금을 해제 할 수 있습니다.
— caw

@Escobar Ceaser이 질문에 대한 올바른 해결책은 무엇입니까?
— Prabs

코드에서 프로그래밍 방식 으로이 작업을 수행하고 싶습니다.
— pollaris

답변:


249

이를 수행하는 데 일반적으로 세 가지 방법이 있습니다.

  1. 답변 중 일부에서 제안했듯이 처음으로 활동이 생성되고에서 복원되는 사례를 구분할 수 있습니다 savedInstanceState. onSaveInstanceState의 매개 변수를 재정의 하고 확인하면됩니다 onCreate.

  2. 매니페스트에 android:screenOrientation="portrait"(또는 "landscape")를 추가하여 한 방향으로 활동을 잠글 수 <activity>있습니다.

  3. 태그 android:configChanges="orientation|screenSize"에서 지정하여 화면 변경을 직접 처리하겠다고 시스템에 알릴 수 <activity>있습니다. 이런 식으로 액티비티는 다시 생성되지 않지만 대신 콜백을 수신합니다 (유용하지 않으므로 무시할 수 있음).

개인적으로 나는 (3)과 함께 갈 것입니다. 물론 방향 중 하나에 앱을 잠그는 것이 괜찮다면 (2)와 함께 갈 수도 있습니다.


13
그래서 # 3을 위해 당신이해야 할 일은 내 매니페스트에 그 줄을 추가하는 것입니까? 작동하지 않기 때문입니다.
— Jimmy D


16
@EscobarCeaser, Android 3.2 이상인 경우android:configChanges="orientation|screenSize"
— Pacerier

9
android:configChanges="orientation|screenSize"나를 위해 작동합니다. 감사합니다 @Pacerier
— Don

1
android:configChanges="orientation|screenSize"많은 사람들이 귀하의 답변을 주요 답변으로 여기기 때문에 답변 사례 # 3 을 API> = 13의 값으로 업데이트하십시오 !
— radistao

215

Xion의 답변은 가깝지 만 android:configChanes="orientation"응용 프로그램의 API 수준이 12 이하가 아니면 # 3 ( )이 작동하지 않습니다.

API 레벨 13 이상에서는 방향이 변경 될 때 화면 크기가 변경되므로 방향이 변경 될 때 활동이 계속 파괴되고 시작됩니다.

아래처럼 "screenSize"속성을 추가하면됩니다.

<activity
    android:name=".YourActivityName"
    android:configChanges="orientation|screenSize">
</activity>

이제 방향을 변경하고 화면 크기가 변경되면 활동이 상태를 유지하고 onConfigurationChanged()호출됩니다. 방향이 변경 될 때 화면에있는 모든 것을 유지합니다 (예 : 웹뷰의 웹 페이지).

이 사이트에서 이것을 배웠습니다 : http://developer.android.com/guide/topics/manifest/activity-element.html

또한 이것은 명백히 나쁜 습관이므로 런타임 변경 처리에 대한 아래 링크를 읽으십시오.

http://developer.android.com/guide/topics/resources/runtime-changes.html


2
덕분에 ... 그 작품은 "오리엔테이션"와 "화면 크기"추가 후
— Pratik Butani에게

삼성 갤럭시 넥서스 안드로이드 4.2.1에서 작동합니다! android:configChanges="orientation|screenSize"
— Vincent Ducastel

놀랄 만한. 활동 재로드 및 처음부터 시작하는 비디오와 관련된 문제를 해결하기 위해 많은 시간 동안 코드를 통해 작업 해 왔습니다. 그리고 여기에 해결책이있었습니다! ++++ 1
— Mathias Asberg

6
나쁜 연습? Pfft, 실제 사람들은 마감일이 있으며 작동하면 작동합니다;)
— Kacy

이것이 나쁜 습관이라면 왜 그렇게 많은 공세를 얻었습니까 ??
— Sharp Edge

26

당신은 단지 AndroidManifest.xml내부 및 내부 또는 활동 레이블 로 가야하며, 누군가가 말한 것처럼이 코드 줄을 입력해야합니다.

android:configChanges="orientation|screenSize"

따라서 다음과 같은 것이 있습니다.

<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>

그것이 효과가 있기를 바랍니다!


레이아웃 랜드 레이아웃을로드하지 않습니다. :( 나를 위해 일하지 않았다
— piyush poriya

16
<activity android:name="com.example.abc" 
 android:configChanges="orientation|screenSize"></activity>

android:configChanges="orientation|screenSize"매니페스트 파일의 활동 탭에 추가 하십시오.

따라서 방향이 변경되면 활동이 다시 시작되지 않습니다.


작동합니다. 그러나 각 orientation.xml 및 layout-land.xml에 대해 별도의 레이아웃을 사용하는 경우. 두 방향 모두에 가로 레이아웃을 적용합니다. "동향"만 사용하면 예상대로로드하지만 다시로드합니다. 이것에 도움이 될 수 있습니까?
— Karthikeyan Ve

1
@KarthikeyanVe 부정 행위를하려고 할 때의 문제입니다. 당신은 것 이 레이아웃 변경에 활동을 다시 시작합니다. 어서 그냥 사용하고 실제 솔루션을 사용 onSaveInstanceState()하고 onCreate().
— Marc Plano-Lesay

@ MarcPlano-Lesay 그리고 어떻게할까요?
— Ahsan

@Weaboo 실제 솔루션은 질문에 링크되어 있습니다 : developer.android.com/guide/topics/resources/…
— Marc Plano-Lesay

@ MarcPlano-Lesay 세로 및 가로 모드에 대해 별도의 레이아웃을 만들었습니다. 가로 또는 세로 모드에서 앱을 열면 정상적으로 작동하지만 런타임에 방향을 변경하려고 할 때마다 앱이 닫히지 만 앱에 로그인 할 때 MainActivity로 이동하여 방향을 변경하여 해당 활동을 다시로드하고 정상적으로 작동합니다. 이제 문제는 왜? 내 코드에 논리적 오류가 있습니까? Idk,하지만 앱을 여러 번 디버깅하려고했는데 아무것도 찾을 수 없습니다. 또한 활동을 다시 시작하고 싶지 않습니다. 구성이 변경 될 때마다 각 레이아웃을 조정할 수없는 이유는 무엇입니까?
— Ahsan

10

기본이 아닌 동작을 방해하지 않고 방향 변경을 올바르게 처리하는 것이 실제로 더 나은 것은 내 경험입니다.

현재 표시된 이미지를 저장하고 onSaveInstanceState()응용 프로그램이 onCreate()다시 실행될 때 올바르게 복원해야 합니다.


# 3은 완벽하게 유효한 솔루션입니다. 그것은의 정확한 이 정확한 문제를 해결하기 위해 만든 도구. 왜 신발 끈이라고 말합니까?
— Pacerier

1
@Pacerier 그냥 문서를 읽으십시오. "참고 : 사용 android:configChanges을 피하고 최후의 수단으로 만 사용해야합니다. 구성 변경으로 인한 재시작을 올바르게 처리하는 방법에 대한 자세한 내용은 런타임 변경 처리 를 참조하십시오."
— Marc Plano-Lesay

저장 및 복원 예를 게시 할 수 있습니까?
— pollaris

6

이 솔루션은 지금까지 가장 잘 작동하는 솔루션입니다. 매니페스트 파일에 추가

<activity
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:name="your activity name"
    android:label="@string/app_name" 
    android:screenOrientation="landscape">
  </activity

그리고 활동 수업에서 다음 코드를 추가하십시오.

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //your code
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  //your code

    }
}

4

매니페스트 android:configChanges="keyboardHidden|orientation|screenSize"에 모든 앱 활동 태그를 추가하십시오 .


3

이걸 당신의 AndroidManifest.xml

<activity android:screenOrientation="landscape">

활동 태그가 있다는 것을 의미합니다. 이것을 다른 매개 변수로 추가하십시오. 세로 방향이 필요한 경우 가로를 세로로 변경하십시오. 도움이 되었기를 바랍니다.


화면을 회전시키는 기능을 없애려고하지 않습니다. 방금 언급 한대로 내 앱을 다시로드하고 싶지 않습니다.
— Jimmy D

추신 ... 이것은 어쨌든 작동하지 않습니다. 앱이 특정 방향으로 표시되도록합니다. 화면을 회전해도 활동이 다시로드됩니다
— Jimmy D

3

manifyt 파일에서 각 활동에 이것을 추가하십시오. 도움이 될 것입니다

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

screenLayout은 나를 위해 일했고, 안드로이드에서 화면 분할을 위해 앱 크기를 조정할 때 새로 고침을 방지했습니다.
— Terren

2

위의 모든 답변이 효과가 없습니다. 그래서, 나는 언급에 의해 해결했습니다 label과 screenOrientation아래에있다. 이제 다 괜찮아

<activity android:name=".activity.VideoWebViewActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize"/>


1

귀하의 이미지 정보를 저장 onPause()또는 onStop()과에서 사용할 onCreate(Bundle savedInstanceState)이미지를 복원 할 수 있습니다.

편집하다:

실제 프로세스에 대한 자세한 정보는 http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle 에서 확인할 수 있습니다. 허니컴은 이전 Android 버전과 다릅니다.


실제로 당신은 onSaveInstanceState () 메소드에서해야합니다
— Willi Mentzel


1

Pacerier가 언급했듯이

android:configChanges="orientation|screenSize"


-1

최고의 솔루션인지는 모르겠지만 여기에 설명합니다.

우선, 당신은 클래스와 함께 인증서가 필요합니다. 앱의 응용 프로그램은 다음과 같이 나타납니다.

<application
    android:name=".App"
    ...

둘째, 내 수업 앱에서 나는 이것을 좋아했다.

public class App extends Application {
    public static boolean isOrientationChanged = false;

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

    @Override
    public void onConfigurationChanged(@NotNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
                newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            isOrientationChanged = true;
        }
    }

}

셋째, 플래그를 방향 변경으로 설정해야합니다. 제 경우에는 앱 탐색 내의 이전 활동이 호출 될 때 항상 설정하므로 나중에 활동이 작성되면 한 번만 호출합니다.

isOrientationChanged = false;

따라서 해당 컨텍스트에서 화면의 방향을 변경할 때 마다이 설정을 변경할 때마다 방향을 변경하고 방향이 변경되는지 확인한 다음 해당 플래그의 값을 기준으로 유효성을 검사합니다.

기본적으로 비동기 개장 요청을 할 때마다 방향을 변경하는 모든 순간을 호출하여 지속적으로 응용 프로그램을 중단시키는 요청을 사용해야했습니다.

if (!isOrientationChanged) {
    presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}

그것이 가장 우아하고 아름다운 해결책인지는 모르겠지만 적어도 여기에서는 기능적입니다 :)


-2

를 onCreate포함하는 활동에서, 메소드 뒤에이 코드를 추가하십시오 .WebView

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);    
}

@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);    
}

1
이것은 어떻게 작동합니까? 런타임에 명시 적으로 말하고 있지 않습니까? 그렇지 않으면 기본적으로 어떻게됩니까?
— Danielson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.