6

EditText와 이미지 뷰 및 버튼으로 약간의 활동이 있습니다. 버튼을 누르면 결과를 위해 카메라가 실행되고 반환하면 방금 찍은 사진으로 이미지보기가 변경됩니다.오리엔테이션 변경시 내보기가 재설정됩니다.

그러나 방향이 바뀌면 이미지 뷰가 레이아웃의 기본 이미지로 다시 설정됩니다.

내가 시도한 것은 사용자 정의라는 부울 값을 설정하는 것이고, 사진을 찍으면 사실로 설정됩니다. onConfigurationChanged()를 재정의하고 custom이 true로 설정된 경우 이미지를 복원합니다.

지금 내 문제는 EditText가 지워지는 것입니다. - 구성을 변경 한 후에 EditText를 어떻게 복원 할 수 있습니까? 내 첫번째 시도는 문자열 onPause()에 내용을 저장하고 복원하는 것이었지만 항상 비어있게되었습니다.

답변

14

일반적으로 UI보기가 상태를 유지하지 않을 때 가장 먼저 확인해야 할 것은이 UI보기에 ID가 할당되어 있다는 것입니다. 이 id가 없으면 뷰는 상태를 복원 할 수 없습니다.


이 문제가 해결되지 않으면

<EditText android:id="@+id/text" ... /> 

, 당신은 자신을 저장하고 상태를 복원 할 필요가있다. Handling Runtime Changes을보세요. 그것은 거의 당신이 무엇을해야하는지 설명 :

이 있도록 활동을 파괴하기 전에 제대로 활동 안드로이드 onSaveInstanceState()를 호출하는 정상적인 활동의 라이프 사이클을 통해 이전 상태를 복원한다는 것이 중요하다 다시 시작을 처리하려면 당신 응용 프로그램 상태에 대한 데이터를 저장할 수 있습니다. onCreate() 또는 onRestoreInstanceState() 동안 상태를 복원 할 수 있습니다. 응용 프로그램 상태를 그대로 유지하면서 응용 프로그램이 다시 시작되는지 테스트하려면 응용 프로그램에서 다양한 작업을 수행하면서 구성 변경 (예 : 화면 방향 변경)을 호출해야합니다. onCreate() 또는 onRestoreInstanceState()의 상태를 복원 한 후

@Override 
protected void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putString("textKey", mEditText.getText().toString()); 
} 

을 그리고 :

public void onCreate(Bundle savedInstanceState) 
{ 
    if(savedInstanceState != null) 
    { 
     mEditText.setText(savedInstanceState.getString("textKey")); 
    } 
} 

을이 아직없는 경우

당신은 onSaveInstanceState()을 무시하고 Acitivity 상태를 저장의 전화했을 때해야 충분하다면, onRetainNonConfigurationInstance()을 오버라이드하고 pa가 될 커스텀 객체를 반환 할 수 있습니다. 새로운 액티비티 객체로 다시 만들어 질 때. 그것을 사용하는 방법에 대한 자세한 내용은 Handling Runtime Changes에서 찾을 수 있습니다. 그러나이 기능은 Android 3.0 이상에서 더 이상 사용되지 않습니다 (구체적으로는 FragmentActivity). 그래서 이것을 단편과 함께 사용할 수 없습니다 (괜찮습니다. 구성 변경에 걸쳐 객체를 유지하는 메커니즘이 있습니다).


그리고 마지막 하나

- android:configChanges를 사용하지 않습니다. 당신은 그것을 사용하는 매우 좋은 이유가 있어야하며, 대개 이것들은 성능상의 이유입니다. 지금과 같은 방식으로 악용 될 의도는 없었습니다. 단지 UI 상태 재설정을 막기 위해서였습니다. 이 속성을 사용하면 yes를 선택하면 구성 변경시 Activity UI가 다시 설정되지 않지만 Activity 상태는 나중에 파괴되어 다시 생성 될 때 재설정됩니다.

문서는 꽤 잘이 옵션을 설명합니다

참고 : 시스템이 자동으로 적용되지 않기 때문에 구성은, 자신이 훨씬 더 어렵 대체 자원을 사용할 수 있습니다 변경 처리. 이 기술은 은 최후의 수단으로 간주되어야하며, 대부분의 응용 프로그램

+0

좋아, 그렇게 생각하면 훨씬 더 나은 접근 방식입니다. 대신이 비트 맵을 사용할 수 있으며 edittext는 문제가되지 않습니다. 그러나 이미지의 상태를 저장하는 데 사용할 함수는 무엇입니까? – Sebastian

+0

비트 맵이 디스크에 저장 되었다면,'onSaveInstanceState()'함수에서 비트 맵에 대한 경로를 저장하면됩니다. 비트 맵이 메모리에 있다면'onRetainNonConfigurationInstance()'를 사용할 수 있습니다. – inazaruk

4

오리엔테이션을 변경 한 후 활동을 다시로드하지 않으려면 android:configChanges="orientation"을 매니페스트의 활동 행에 추가하면됩니다.

+0

하지 않는 것이 좋습니다하지만 그 활동이 옆으로되는 전화에 적응하지하지까요? – Sebastian

+0

정답입니다. 화면이 방향을 바꾸는 것을 막는 것은'android : screenOrientation = "portrait"' –

+4

입니다.이 특별한 경우는 수정되지만, 근본적인 문제는 수정되지 않습니다. 그리고'android : configChanges'는 최후의 수단으로 생각되며 일반적으로 결코 사용되어서는 안됩니다. http://developer.android.com/guide/topics/resources/runtime-changes.html – inazaruk