0

기기가 세로에서 가로로 회전 할 때마다 do_something()이 필요합니다.화면 회전 직전에 무엇인가 하시겠습니까?

나는 내 매니 페스트에 <activity android:configChanges="orientation" >을 추가했습니다. 따라서 내 장치를 돌릴 때마다 이 호출됩니다. 그리고 그것은 이 아니며은 활동을 다시 만듭니다. 내 기능에

:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     do_something(); 
    } 
    then_fire_off_the_screen_rotation_as_normal(); 
    // which means re-start the Activity 
    // i expect it will fire off onSaveInstanceState() -> onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume() 
} 

내 문제는 내가 then_fire_off_the_screen_rotation_as_normal()에서 무엇을 할 수 있는지 잘 모릅니다.

내가 setRequestedOrientation()를 사용하여 시도했지만 이러한 목적으로 서비스를 제공하는 기능이없는 것 같다

ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, ActivityInfo.SCREEN_ORIENTATION_SENSOR, 또는 ActivityInfo.SCREEN_ORIENTATION_USER에서 활동은 여전히 ​​이 다시 시작되지 않습니다 내가 통과 할 때. (전화하지 않는 것처럼)

ActivityInfo.SCREEN_ORIENTATION_NOSENSOR을 전달하면 방향 센서가 꺼집니다. (이 말했듯이.)

내가 ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE 전달

이 활동은 AndroidRuntime:NullPointerException강제 닫기했다.


(구체적으로 : 그것은 가로 레이아웃의 세로 레이아웃에서 프로그램 추가 조각이 있기 때문입니다,하지만 그들은 풍경에 필요하지 않은 것처럼 do_something() 함수에서, 내가 그 조각을 제거합니다. 모드를 사용합니다.)

답변

3

글쎄, 난이 간단한 방법은 내가하고 싶은 역할을 할 수 같아요. 무단 전복 을 의미합니다.onSaveInstanceState()에서

:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     do_something(); 
    } 
    super.onSaveInstanceState(outState); 
} 

는 * 당신이 do_something()이전super.onSaveInstanceState()합니다.

내 경우에는, 내가 레이아웃에서, 그리고 활동에서 파편을 제거하기 때문에.이 super.onSaveInstanceState() 후, 레이아웃 이미 번들로 저장 될 경우

(. 그런 다음 조각은 가 다시 될 것입니다 활동이 다시 생성 된 후 생성됨 ###)

###이 현상이 입증되었습니다. 그러나 What to determine a Fragment restore upon Activity re-create?의 이유는 제 추측에 의한 것입니다. 이에 대한 아이디어가 있으면 my another question으로 대답하십시오. 감사!


좋고, 제 댓글에서 제기 된 문제를 해결 상기 방법에있어서 개선 :

private boolean isDevicePortrait() { 
    return (findViewById(R.id.A_View_Only_In_Portrait) != null); 
} 
:

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

private boolean isPortrait2Landscape() { 
    return isDevicePortrait() && (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE); 
} 

isDevicePortrait() 같이 것 (정지 단순)

* 우리는 을 사용할 수 없다는 것을 알아 두십시오. getResources().getConfiguration().orientation을 사용하면 그는 현재 이며 문자 그대로 인물입니다. Resources 객체가 화면이 회전 후에 권리를 변경하기 때문이다 -에도onSaveInstanceState()를 호출하기 전에 ! 당신이 방향을 테스트하는 findViewById()을 사용하지 않으려는 (어떤 이유로, 그리고 그렇게 깔끔한 Afterall는 아니다) 경우

, 전역 변수 private int current_orientation;을 유지하고 onCreate()current_orientation = getResources().getConfiguration().orientation;하여 초기화. 이것은 깔끔하게 보입니다. 그러나 우리는 이 아닌 것으로 알고 있어야합니다.은 활동주기 중 어디에서나 변경하십시오.

+0

글쎄, 난 이미이 접근법의 결정 약점 생각. 우리는 풍경 모드에있는 동안 앱을 전환하거나 화면을 잠급니다. **는 ** do_something()을 트리거합니다 **. – midnite

1
// which means re-start the Activity 
// i expect it will fire off onSaveInstanceState() -> onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume() 

onPause(), 이동 중지() 등 발광하는이 가정은 올바르지 않습니다. onConfigurationChanged을 사용하면 Android가 해당 단계를 거치지 않고 대신 임시 변수의 레이아웃에 정보 저장을 처리 한 다음 InitializeUI()을 호출하고 원하는 방식으로 레이아웃을 다시 설정합니다. 나는 비슷한 순간에 나를 위해 일하는 것과 비슷한 것을 보여줄 것입니다.

편집 : 여기에 샘플

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    setContentView(R.layout.main); 
    Log.i("configChange", "configChange"); 

    String tmp = connect.getText().toString(); 
    boolean onTmp = on.isEnabled(); 
    boolean offTmp = off.isEnabled(); 
    boolean connTmp = reconnect.isEnabled(); 

    InitializeUI(); 

    connect.setText(tmp); 
    on.setEnabled(onTmp); 
    off.setEnabled(offTmp); 
    reconnect.setEnabled(connTmp); 
} 

지금 내 InitializeUI() 방법은 findViewById를의의 무리하지만 아무것도하지 않으며 onClickListeners을 seetting에게 있습니다. 또한 InitializeUI() in your onCreate()`를 호출하십시오.

희망이 있으면 도움이 될 것입니다.

하지에이 <activity android:configChanges="orientation" >을 추가

+0

답장을 보내 주셔서 감사합니다. @TronicZomB. 나는이 접근 방식에 대해서도 생각해 보았다. 당신의 예제는'InitializeUI()'전에 상태를 저장하고 나중에 복원 할 것을 상기시켰다. 그러나 당신의 제안을 읽는 동안, 나는 생각보다 간단한 솔루션을 내 문제를 해결할 수 있습니다. 어떤 결점이 있다면 저를 바로 잡으십시오 :) – midnite

+0

당신이 생각해 낸 새로운 해결책은 무엇입니까? – TronicZomB

+0

게시 됨 :-) – midnite