1262

내 Android 애플리케이션에서 기기를 회전 (키보드를 슬라이드)하면 내Activity다시 시작됩니다 (onCreate호출됩니다). 자, 이것이 아마 어떻게 될지는 모르겠지만, 나는 초기에 많은 설정을했습니다.onCreate메서드가 필요하므로 다음 중 하나가 필요합니다.

  1. 모든 초기 설정을 다른 기능에 넣으십시오. 기기 회전시 모두 손실되지는 않습니다.
  2. 그렇게 만들어onCreate다시 호출되지 않고 레이아웃이 조정되거나
  3. 앱을 세로로만 제한하여onCreate호출되지 않습니다.


30 답변


920

응용 프로그램 클래스 사용

초기화시 수행중인 작업에 따라 확장하는 새 클래스를 만들 수 있습니다.Application초기화 코드를 오버라이드 (override)로 옮기는 것onCreate메서드를 호출합니다.

public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

그만큼onCreate응용 프로그램 클래스의 응용 프로그램 클래스는 응용 프로그램이 모두 만들어 질 때만 호출되므로 오리엔테이션 또는 키보드 가시성 변경시 작업이 다시 시작 되어도 트리거되지 않습니다.

이 클래스의 인스턴스를 싱글 톤으로 노출하고 getter 및 setter를 사용하여 초기화하는 응용 프로그램 변수를 노출하는 것이 좋습니다.

참고 : 매니페스트에 등록하고 사용하려면 새 Application 클래스의 이름을 지정해야합니다.

<application
    android:name="com.you.yourapp.MyApplicationClass"

구성 변경에 반응 [업데이트 : API 13 이후에는 사용되지 않습니다.권장 대체품보기]

또 다른 대안으로, 응용 프로그램에서 재시작 방향 및 키보드 가시성 변경과 같은 이벤트를 수신하도록하고 작업 내에서이를 처리하도록 할 수 있습니다.

다음을 추가하여 시작하십시오.android:configChanges노드를 활동의 매니페스트 노드에 추가

android:configChanges="keyboardHidden|orientation"

또는을 위해Android 3.2 (API 수준 13) 이상:

android:configChanges="keyboardHidden|orientation|screenSize"

그런 다음 활동 내에서onConfigurationChanged방법 및 전화setContentView새로운 방향에서 GUI 레이아웃을 다시 수행하도록 강제합니다.

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}


  • 나는 두 번째 방법이 효과가 있다고 생각하지 않는다. 나는 그것을 시도했다; EditText를 사용한 하나의 활동. 나는 약간의 텍스트를 거기에 썼고, 방향을 바꿨다. 그리고 텍스트는 갔다 / 리셋되었다. - Ted
  • 앞으로는 onRotate () 메소드가 기대됩니다. 이와 같은 일에 대해 걱정할 필요가있는 것은 솔직히 실망 스럽습니다. - Kelly Sutton
  • 유의 사항Android 개발자 가이드이 사용에 대한주의 사항 :참고 : (android:configChanges)는 피하고 최후의 수단으로 만 사용해야합니다. 구성 변경으로 인해 재시작을 올바르게 처리하는 방법에 대한 자세한 내용은 런타임 변경 처리를 참조하십시오.대신 회전 이벤트에서 데이터를 유지하기 위해onSaveInstanceState Bundle; 또는 @ Jon-O보증,onRetainNonConfigurationInstance. - Jeffro
  • 그것은 단지 나쁜 반응을 보입니다.현재 알려진구성 변경. 최신 Android 버전에서는 매니페스트의 모든 구성 변경 사항을 나열해야하므로이 코드가 포착하지 못하는 다른 구성 변경이 발생할 수 있습니다. 상태를 저장하는 솔루션onRetainNonConfigurationChanges내결함성이 뛰어나고 솔직합니다. - Bananeweizen
  • 나는 너를 추가해야한다고 생각해.3.2에 대한이 업데이트당신의 대답에, 그것은 (그 문제에 직면 한) 매우 중요하며 간과 할 수도 있습니다. - bigstones

179

Android 3.2 이상용 업데이트 :

주의: Android 3.2 (API 레벨 13)부터 시작하여"화면 크기"도 변경됩니다.장치가 가로 및 세로 방향으로 전환 할 때 따라서 API 수준 13 이상 (minSdkVersion 및 targetSdkVersion 속성에 의해 선언 된대로)을 개발할 때 방향 변경으로 인해 런타임이 다시 시작되는 것을 방지하려면"screenSize"가치 이외에"orientation"값. 즉, 선언해야합니다.android:configChanges="orientation|screenSize". 그러나 애플리케이션이 API 레벨 12 이하를 목표로하는 경우 활동이 항상이 구성 변경을 처리합니다 (이 구성 변경으로 인해 Android 3.2 이상 기기에서 실행되는 경우에도 활동이 다시 시작되지 않음).


  • 그 위의 코멘트가 그것을 조사하기 위해 거의 나를 보냈기 때문에, 그 명확한 설명에 감사드립니다. 현재 API 8을 타겟팅하고 있으며 코드에 configChanges에 screenSize가없고 ICS를 실행하는 기기에서 제대로 작동하는지 확인할 수 있습니다. - Carl
  • 이것을 지적 해 주셔서 감사 드리며, 안드로이드 만 가지고 있습니다 : configChanges = & quot; orientation | screenSize & quot; 설정 및 오리엔테이션 전환이 내 활동을 재현하고 있었고, 내 인생에서 그 이유를 알 수 없었습니다! - Christopher Perry
  • 고마워. 그롬. 너는 내 하루를 구했다. 나는 ICS & amp; android : configChanges = & quot; orientation | keyboardHidden & quot;을 사용하여 내 활동을 재현했지만 제안은 마술처럼 작동했습니다. - AndroidGuy
  • android 추가 : configChanges최후의 수단으로 만 사용해야한다.. 사용 고려FragmentssetRetainInstance대신. - Simon Forsberg
  • 요점은screenSize안드로이드 3.2 이상, 그게 내 문제를 해결, 감사합니다! - fantouch

113

그 (것)들을 멈추는 대신에onCreate()모두 해고되는 것을 막기 위해Bundle savedInstanceState그 이벤트가 null인지 아닌지를 확인하기 위해서 이벤트에 건네받습니다.

예를 들어, 어떤 논리가 실행되어야 할 때Activity모든 오리엔테이션 변화가 아니라 진정한 의미로 만들어졌습니다.onCreate()오직savedInstanceStatenull

그렇지 않으면 레이아웃을 위해 레이아웃을 다시 그리기를 원합니다.

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

이것이 궁극적 인 대답인지 확실하지 않지만 그것이 나를 위해 일합니다.


  • 실제로 상태를 저장하는 곳은 어디입니까? - Ewoks
  • 이것은 나를 위해 작동하는 것으로 보인다 그리고 그것은 훨씬 간단한 방법으로 보인다. 나는 당신에게 단지 5 개의 광산을 포함한 4 개의 업을 얻었고, 373을 서브 클래 싱하는 아이디어를 얻었다는 것을 알았다. 이 단점이 있습니까? - steveh
  • 이 솔루션은 저에게 큰 도움이되었습니다. 나는 할 수 있었다.Intent serverintent = new Intent(MainActivity.this, MessageListener.class);startService(serverintent);만드는 방법serverSocket = new ServerSocket(0xcff2);Socket client = serverSocket.accept();~와BufferedReader(new InputStreamReader(client.getInputStream()));내 안드로이드를 회전시키고 클라이언트 / 서버 연결을 활성 상태로 유지하면서 GUI를 회전시킬 수 있습니다. 설명서에 따르면 마지막 활동이 종료되면 savedInstanceState가 초기화됩니다. - Fred F
  • 이해가 안되는 부분은 무엇입니까? 이는 다른 솔루션보다 훨씬 뛰어나고 복잡합니다. - RTF
  • 이것이 Android에서 올바른 방법입니다. 기본적으로 configChanges로 회전하는 다른 방법과 부피가 크고 복잡하며 불필요한 모든 방법. - LukeWaggoner

93

제가 한...

매니페스트에서 활동 섹션에 추가됨 :

android:configChanges="keyboardHidden|orientation"

구현 된 코드에서

//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
    //get views from ID's
    this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);

    //etc... hook up click listeners, whatever you need from the Views
}

//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    InitializeUI();
}

//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);

    InitializeUI();
}


  • 명확히하기 위해 : 당신은 이제 onCreate ()에서 변수 초기화를 가질 수 있고 onConfigurationChanged ()는 단순히 화면 회전을 위해 호출 될 것입니다. 귀하의 변수는 이제 화면 회전 ;-) 좋은 및 ez 절연 - Someone Somewhere
  • 여기에 설명 된대로 모든 것을했는데 오리엔테이션 변경 후 버튼을 누르면 NullPointerException이 발생합니다. 무엇이 잘못 될 수 있습니까? - Finnboy11
  • android 추가 : configChanges최후의 수단으로 만 사용해야한다.. 사용 고려FragmentssetRetainInstance대신. - Simon Forsberg
  • 내 대답은 3 년 전과 마찬가지로 안드로이드는 진화를 계속한다는 것을 명심하십시오. Simon - 샘플 코드에 대한 링크가 있습니까? 사람들에게 필요한 것입니다. - Someone Somewhere
  • android : configChanges, @ SimonAndr & Forsberg에 대해 경고 할 때 실제로 Forsberg는Android 워드 프로세서.런타임 변경 사항 처리대안 (샘플 코드 포함)에 대한 자세한 정보가 있습니다. - Leif Arne Storset

59

당신이 설명하는 것은 기본 동작입니다. 다음을 추가하여 이러한 이벤트를 직접 감지하고 처리해야합니다.

android:configChanges

매니페스트에 추가 한 다음 변경하려는 내용을 처리합니다. 따라서 오리엔테이션에서는 다음을 사용합니다.

android:configChanges="orientation"

그리고 키보드를 열거 나 닫을 때는 다음을 사용하십시오 :

android:configChanges="keyboardHidden"

두 가지를 모두 처리하려면 다음과 같은 pipe 명령으로 구분할 수 있습니다.

android:configChanges="keyboardHidden|orientation"

이것은 당신이 호출 한 Activity에서 onConfigurationChanged 메소드를 트리거합니다. 메서드를 재정의하면 새 값을 전달할 수 있습니다.

희망이 도움이됩니다.


  • 아래 내 대답을 참조하십시오.android:configChanges="orientation"최소한 안드로이드 2.1에서는 에뮬레이터에서 버그를 일으키는 것 같다. - Liudvikas Bukys
  • android 추가 : configChanges최후의 수단으로 만 사용해야한다.. 사용 고려FragmentssetRetainInstance대신. - Simon Forsberg
  • @ GregD 내가 알기로, 지금은 오늘날의 상황을 반영하여 업데이트하기에 좋은 시점입니다. 이 질문에 주어진 upvotes의 수를 감안할 때, 그것은 아직 다른 질문에서 언급되고 있습니다. - Simon Forsberg

39

방금이 지식을 발견했습니다.

오리엔테이션 변경을 통해 활동을 유지하고onConfigurationChanged,문서위 코드 샘플매니페스트 파일에 다음을 제안하십시오.

android:configChanges="keyboardHidden|orientation"

항상 효과가 있다는 이점이 있습니다.

보너스 지식은keyboardHidden논리적 인 것처럼 보일지 모르지만, 에뮬레이터에서 오류를 발생시킵니다 (최소한 Android 2.1의 경우) : 지정 만orientation에뮬레이터에서 둘 다 호출하게합니다.OnCreateonConfigurationChanged때때로, 그리고 오직OnCreate다른 시간.

장치에서 오류를 보지 못했지만 다른 장치에서 실패한 에뮬레이터에 대해 들었습니다. 따라서 문서화 할 가치가 있습니다.


  • 에뮬레이터가 "방향"만으로 완전히 도청되었음을 확인할 수 있습니다. 밤에 이것으로 머리카락을 찢어 버리고 그냥 작동하는 문제를 발견했습니다. - locka
  • 주의 사항 : Android 3.2 (API 레벨 13)부터 시작하여 & quot; 화면 크기 & quot; 장치가 가로 및 세로 방향으로 전환 될 때도 변경됩니다. 따라서 API 수준 13 이상을 개발할 때 방향 변경으로 인해 런타임이 다시 시작되는 것을 방지하려면 android : configChanges = & quot; orientation | keyboardHidden | screenSize & quot; - Geltrude
  • 예, 에뮬레이터가 큰 시간을 허비합니다. 구성 변경 사항을 정확하게보고 할 수는 없습니다. - IgorGanapolsky
  • android 추가 : configChanges최후의 수단으로 만 사용해야한다.. 사용 고려FragmentssetRetainInstance대신. - Simon Forsberg

33

Android 플랫폼의 방향 변경에 따른 데이터 지속 방식의 사용을 고려해 볼 수도 있습니다.onRetainNonConfigurationInstance()getLastNonConfigurationInstance().

이렇게하면 서버 가져 오기에서 얻은 정보 나 계산 된 정보와 같은 구성 변경을 통해 데이터를 유지할 수 있습니다.onCreate또는 Android를 다시 레이아웃 할 수있게하는 동안Activity현재 사용중인 방향에 대해 xml 파일을 사용합니다.

만나다이리또는이리.

이러한 메소드는 이제는 권장되지 않지만 (위의 솔루션 대부분이 제시하는 방향 변경을 처리하는 것보다 훨씬 유연하지만) 모든 사용자가Fragments대신에setRetainInstance(true)각각에Fragment당신은 유지하고 싶습니다.


  • 나는 Fragments와 setRetainInstance가이 일을하는 가장 좋은 방법이라고 생각합니다. +1은 당신에게, -1은 다른 모든 것에 가장 좋습니다. android 추가 : configChanges최후의 수단으로 만 사용해야한다. - Simon Forsberg

28

이 접근법은 유용하지만 Fragments를 사용할 때는 불완전합니다.

프래그먼트는 일반적으로 구성 변경시 다시 생성됩니다. 이 일이 발생하기를 원하지 않으면

setRetainInstance(true);조각의 생성자에서

이로 인해 구성 변경 중에 조각이 유지됩니다.

http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)


  • 동의했다. 최신 Android API를 사용하면 Fragments가이 문제를 해결하는 올바른 방법 인 것처럼 보입니다. 나는 아직 그것을 시도하지 않았지만 내가 모은 것을 읽었습니다.이 페이지, 당신은 기본적으로 당신이 액티비티에서 구현했던 것 중 99 %를 프래그먼트의 서브 클래스로 이동시킨 다음, 그 프래그먼트를 액티비티에 추가합니다. 액티비티는 여전히 화면 회전시 파괴되고 다시 생성되지만 Android에 구체적으로 알릴 수는 있습니다.아니조각을 파괴하기 위해setRetainInstance()메소드 @Abdo 언급했다. - brianmearns

21

방금 추가했습니다.

     android:configChanges="keyboard|keyboardHidden|orientation"

매니페스트 파일에서추가하지 않았다.어떤onConfigurationChanged내 활동의 방법.

키보드가 미끄러지거나 아무 일도 일어나지 않을 때마다.


  • 에 추가 된<application ...android:configChanges="keyboard|keyboardHidden|orientation">작동하고 있습니다. build.gradle의 내 설정 :minSdkVersion 15, compileSdkVersion 23, buildToolsVersion "23.0.2" - Junior M

13

 onConfigurationChanged is called when the screen rotates. 
 (onCreate is no longer called when screen rotates due to manifest, see:  
 android:configChanges)

매니페스트의 어느 부분에 "전화하지 마세요.onCreate()"?

또한, Google의 문서는 사용하지 말라고 말합니다.android:configChanges(최후의 수단을 제외하고는) .... 그러나 그 다음에 그들이 제안하는 다른 방법들해야 할 것용도android:configChanges.

에뮬레이터가 항상 호출하는 것은 제 경험이었습니다.onCreate()회전시.

하지만 동일한 코드를 실행하는 1-2 개의 장치는 ...하지 마십시오. 왜 어떤 차이가 있는지 확신 할 수 없습니다.


  • 에뮬레이터는 너무 느리고 벗겨지기 쉽고 현실감이 부족하여 여러 스크린 크기와 키보드 및 키보드가 포함 된 장치 (지금까지 3 대의 휴대 전화와 2 개의 태블릿 - swappa 또는 ebay와 같은 사이트에서 사용되는 매우 저렴한 장치)를 구매하기로 결정했습니다. (주로 뿌리를 둔) OS 버전 등을 달리기). 이것은 정말 잘 작동하며 투자 가치가 있습니다. - Carl

13

매니페스트에 다음 행을 추가하십시오.

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

활동에 대한이 스 니펫 :

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }


  • 첫 번째 스 니펫을 추가하면 문제를 해결하는 데 충분했습니다. +1 - 030
  • 첫 번째 스 니펫을application스 니펫AndroidManifest.xml - 030

13

그만큼onCreate메서드를 변경하더라도 여전히 메서드가 호출됩니다.orientationandroid의 따라서이 무거운 기능을이 방법으로 옮기는 것은 도움이되지 않습니다.


13

아래에 코드를 넣으십시오.<activity>~에Manifest.xml:

android:configChanges="screenLayout|screenSize|orientation"


12

Android 매니페스트의 변경 사항은 다음과 같습니다.

android:configChanges="keyboardHidden|orientation" 

활동 내에서 이루어질 수있는 추가 사항은 다음과 같습니다.

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}


12

다음 단계를 수행하는 것은 매우 간단합니다.

<activity
    android:name=".Test"
    android:configChanges="orientation|screenSize"
    android:screenOrientation="landscape" >
</activity>

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

노트 :오리엔테이션은 당신의 요구에 달려 있습니다.


11

이를 수행하는 방법에는 여러 가지가 있습니다.

활동 상태 저장

활동 상태를에 저장 할 수 있습니다.onSaveInstanceState.

@Override
public void onSaveInstanceState(Bundle outState) {
    /*Save your data to be restored here
    Example : outState.putLong("time_state", time); , time is a long variable*/
    super.onSaveInstanceState(outState);
}

그런 다음bundle상태를 복원합니다.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState!= null){
       /*When rotation occurs
        Example : time = savedInstanceState.getLong("time_state", 0); */
    } else {
      //When onCreate is called for the first time
    }
}

직접 방향 변경 처리

또 다른 대안은 직접 오리엔테이션 변경을 처리하는 것입니다. 그러나 이것은 좋은 연습으로 간주되지 않습니다.

매니페스트 파일에 추가하십시오.

android:configChanges="keyboardHidden|orientation"

Android 3.2 이상 :

android:configChanges="keyboardHidden|orientation|screenSize"

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //Handle rotation from landscape to portarit mode here
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        //Handle rotation from portrait to landscape mode here
    }
}

회전 제한

회전을 피하기 위해 액티비티를 세로 또는 가로 모드로 제한 할 수도 있습니다.

매니페스트 파일의 액티비티 태그에 다음을 추가합니다.

        android:screenOrientation="portrait"

또는 귀하의 활동에 프로그래밍 방식으로 구현하십시오.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}


10

이 작업을 수행 한 방법은onRestoreInstanceState그리고onSaveInstanceState이벤트를 저장하려면Bundle(비록 당신이 어떤 변수를 저장하지 않아도된다면, 거기에 뭔가를 넣으십시오.Bundle비어 있지 않습니다). 그런 다음onCreate메소드가Bundle비어 있고, 그렇다면 초기화를 수행하고 그렇지 않으면 초기화하십시오.


  • 투표! 이것이 올바른 방법입니다. 여기있는 모든 사람들의 대부분은 잘못하고 있습니다. - Salman Abbas
  • 나는 그것을 찾기 위해 무리를 스크롤해야했다. 이것이 내가이 문제를 해결하는 데 필요한 것이었다. - Andreas Rudolph

9

"안드로이드 방식"이 아니지만 방향 변경을 직접 처리하고 변경된 방향을 고려하기 위해 위젯의 위치를 간단히 변경하여 매우 좋은 결과를 얻었습니다. 뷰를 저장하고 복원 할 필요가 없으므로 다른 어떤 방법보다 빠릅니다. 또한 재배치 된 위젯은 정확히 동일한 위젯과 이동 및 크기 조정을하기 때문에 사용자에게보다 매끄러운 환경을 제공합니다. 모델 상태뿐 아니라 뷰 상태도 이러한 방식으로 보존 될 수 있습니다.

RelativeLayout때로는 방향을 재조정해야하는 관점에서 좋은 선택이 될 수 있습니다. 각 하위 위젯에 대해 서로 다른 상대 위치 지정 규칙을 사용하여 일련의 세로 레이아웃 매개 변수 세트와 조경 된 레이아웃 매개 변수 세트를 제공하기 만하면됩니다. 그런 다음onConfigurationChanged()메소드를 호출하면 적절한 메소드를setLayoutParams()각 어린이에게 전화하십시오. 자식 컨트롤 자체가 필요하면내부적으로다시 방향을 바꾼다면, 그 아이에 대한 방 법을 호출하여 재배 향을 수행 할 수 있습니다. 그 자식은 비슷하게 메소드를 호출합니다.그...내부 재배치가 필요한 하위 컨트롤 등이 있습니다.


  • 나는이 샘플 코드를보고 싶다. 훌륭하게 보인다! - Henrique de Sousa

6

노트 :나는 미래의 누군가가 나와 같은 문제에 직면하면이 대답을 게시합니다. 나를 위해 다음 줄은 충분하지 않았습니다.

android:configChanges="orientation"

화면을 회전 시켰을 때`onConfigurationChanged (Configuration newConfig) 메소드가 호출되지 않았습니다.

해결책:문제가 오리엔테이션과 관련이있는 경우에도 "screenSize"를 추가해야했습니다. 따라서 AndroidManifest.xml - 파일에 다음을 추가합니다.

android:configChanges="keyboardHidden|orientation|screenSize"

그런 다음 메서드를 구현합니다.onConfigurationChanged(Configuration newConfig)


5

onSavedInstanceState 메서드를 사용하여 모든 값을 해당 매개 변수에 저장해야합니다.

@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        outPersistentState.putBoolean("key",value);
    }

사용

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        savedInstanceState.getBoolean("key");
    } 

개체를보기 위해 검색 및 값 설정 화면 회전을 처리합니다.



5

화면이 회전 할 때마다 열린 활동이 끝나고 onCreate ()가 다시 호출됩니다.

1 . 화면이 회전 될 때 활동 상태를 저장하는 한 가지 작업을 수행 할 수 있으므로 활동의 onCreate ()가 다시 호출 될 때 모든 오래된 항목을 복구 할 수 있습니다.     부치다링크

2. 활동을 다시 시작하지 않으려면 manifest.xml 파일에 다음 행을 추가하면됩니다.

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


3

의 활동 섹션에서manifest, 추가 :

android:configChanges="keyboardHidden|orientation"


3

매니페스트에 다음 줄을 추가하십시오. android:configChanges="orientation|screenSize"


3

사람들은 당신이 사용해야한다고 말하고 있습니다.

android:configChanges="keyboardHidden|orientation"

그러나 Android에서 회전을 처리하는 가장 효과적이고 가장 전문적인 방법은 Loader 클래스를 사용하는 것입니다. 그것은 유명한 클래스가 아닙니다. (왜 그런지 모르겠지만) AsyncTask보다 훨씬 낫습니다. 자세한 내용은 Udacity의 Android 교육 과정에있는 Android 자습서를 참조하십시오.

물론 다른 방법으로 onSaveInstanceState를 사용하여 값이나 뷰를 저장하고 onRestoreInstanceState를 사용하여 값을 읽을 수 있습니다. 그것은 당신에게 달려 있습니다.


2

시행 착오를 거친 후 나는 대부분의 상황에서 나의 필요에 맞는 해결책을 발견했다. 코드는 다음과 같습니다.

매니페스트 구성 :

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

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

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

</manifest>

MainActivity :

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";

    private Fragment mFragment;

    private int mSelected = -1;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate  " + "");

        // null check not realy needed - but just in case...
        if (savedInstanceState == null) {

            initUi();

            // get an instance of FragmentTransaction from your Activity
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            /*IMPORTANT: Do the INITIAL(!) transaction only once!
            * If we call this everytime the layout changes orientation,
            * we will end with a messy, half-working UI.
            * */
            mFragment = FragmentOne.newInstance(mSelected = 0);
            fragmentTransaction.add(R.id.frame, mFragment);
            fragmentTransaction.commit();
        }
    }


    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged  " +
                   (newConfig.orientation
                    == Configuration.ORIENTATION_LANDSCAPE
                    ? "landscape" : "portrait"));

        initUi();

        Log.i(TAG, "onConfigurationChanged - last selected: " + mSelected);
        makeFragmentTransaction(mSelected);
    }


    /**
     * Called from {@link #onCreate} and {@link #onConfigurationChanged}
     */
    private void initUi() {
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate  instanceState == null / reinitializing..." + "");
        Button btnFragmentOne = (Button) findViewById(R.id.btn_fragment_one);
        Button btnFragmentTwo = (Button) findViewById(R.id.btn_fragment_two);
        btnFragmentOne.setOnClickListener(this);
        btnFragmentTwo.setOnClickListener(this);
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME!!!");
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME, AS WELL!!!");
    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume  " + "");
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause  " + "");
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy  " + "");
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.btn_fragment_one:
                Log.d(TAG, "onClick btn_fragment_one " + "");
                makeFragmentTransaction(0);
                break;

            case R.id.btn_fragment_two:
                Log.d(TAG, "onClick btn_fragment_two " + "");
                makeFragmentTransaction(1);
                break;

            default:
                Log.d(TAG, "onClick  null - wtf?!" + "");
        }
    }


    /**
     * We replace the current Fragment with the selected one.
     * Note: It's called from {@link #onConfigurationChanged} as well.
     */
    private void makeFragmentTransaction(int selection) {

        switch (selection) {
            case 0:
                mFragment = FragmentOne.newInstance(mSelected = 0);
                break;
            case 1:
                mFragment = FragmentTwo.newInstance(mSelected = 1);
                break;
        }

        // Create new transaction
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        transaction.replace(R.id.frame, mFragment);

        /*This would add the Fragment to the backstack...
        * But right now we comment it out.*/
        //        transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }

}

샘플 조각 :

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * @author Martin Pfeffer (pepperonas)
 */
public class FragmentOne extends Fragment {

    private static final String TAG = "FragmentOne";


    public static Fragment newInstance(int i) {
        Fragment fragment = new FragmentOne();
        Bundle args = new Bundle();
        args.putInt("the_id", i);
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView  " + "");
        return inflater.inflate(R.layout.fragment_one, container, false);
    }

}

에서 찾을 수 있습니다.기둥.


2

용도orientation다른 방향으로 다른 작업을 수행 할 수 있습니다.

@Override
public void onConfigurationChanged(Configuration myConfig) 
{
    super.onConfigurationChanged(myConfig);
    int orient = getResources().getConfiguration().orientation; 
    switch(orient) 
    {
       case Configuration.ORIENTATION_LANDSCAPE:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
       case Configuration.ORIENTATION_PORTRAIT:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
       default:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
}


2

이 코드를 아래에 넣으십시오.Activity...에서Android Manifest.

android:configChanges="orientation"

오리엔테이션을 변경하면 활동이 다시 시작되지 않습니다.


  • @Mavamaarten 아마 다른 사람들이 지적했듯이, 나쁜 습관과 10 개의 다른 해답이 이미 이것을 다루었 기 때문일 것입니다. - MikkoP

2

화면 방향 (가로 또는 세로) 고정AndroidManifest.xml

android:screenOrientation="portrait"또는android:screenOrientation="landscape"

이것을 위해onResume()메서드가 호출되지 않습니다.


  • 어떻게 무언가를 고치는 것이 대답입니까? 사용자가 기기를 잠그면 기기가 회전 할 수있는 이유는 무엇인가요? - Reinherd

0

이 코드를 사용하여 화면의 현재 방향으로 고정시킬 수 있습니다 ...

int currentOrientation =context.getResources().getConfiguration().orientation;
        if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
            ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            ((Activity) context). setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }


0

액티비티에서 ViewModel 객체를 사용할 수 있습니다.

ViewModel 객체는 구성 변경 중에 자동으로 유지되므로 보유하고있는 데이터를 다음 액티비티 또는 프래그먼트 인스턴스에서 즉시 사용할 수 있습니다. 더 읽기 :

https://developer.android.com/topic/libraries/architecture/viewmodel

연결된 질문


관련된 질문

최근 질문