단말의 방향을 바꿨을 때 XML 레이아웃이 다르게 보여야 하기 때문에 액티비티가 메모리에서 없어졌다가 다시 만들어지게 된다. 따라서 가로방향과 세로방향의 XML 레이아웃을 따로 만들어 둘 필요가 있다.
가로 방향에 쓰이는 XML 레이아웃은 layout-land 폴더를 만들고 그 안에 만들면 된다.
onStart(), onStop(), onDestroy() 메소드를 재정의해서 실제로 메모리에서 없어졌다 다시 만들어지는지도 확인해보았다.
@Override
protected void onStart() {
super.onStart();
showToast("onStart()");
}
@Override
protected void onStop() {
super.onStop();
showToast("onStop()");
}
@Override
protected void onDestroy() {
super.onDestroy();
showToast("onDestroy()");
}
public void showToast(String data){
Toast.makeText(this, data, Toast.LENGTH_LONG).show();
}
하지만 화면이 바뀔때마다 액티비티가 메모리에서 없어졌다가 새로 만들어지면 선언해두었던 변수 값이 다 사라지게 된다.
액티비티 안에 선언해두었던 변수 값을 저장해서 다시 복원하기 위해선 onSaveInstanceState 콜백 메소드를 사용하면 된다.
이 메소드는 액티비티가 종료되기 전의 상태를 저장하고, 저장한 상태는 onCreate() 메소드가 호출될 때 전달되는 번들 객체로 복원할 수 있다.
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("name", name);
}
if(savedInstanceState != null){
name = savedInstanceState.getString("name");
showToast("값을 복원 : " + name);
}
위와 같은 방법은 화면이 가로와 세로일 때의 액티비티가 서로 다를 때 사용하는 방법이다.
액티비티는 바꾸지 않고 화면에 보이는 레이아웃만 바꾸고 싶다면 액티비티를 유지하는 방법을 사용하면 된다.
먼저 AndroidManifest.xml 파일의 < activity > 태그안에 configChanges 속성을 추가한다.
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:exported="true">
그 후 MainActivity.java 파일에서 onConfigurationChanged 메소드를 재정의한다.
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
showToast("방향 : ORIENTATION_LANDSCAPE");
}else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
showToast("방향 : ORIENTATION_PORTRATI");
}
}