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


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

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

<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.