앱을 만들면서 겪는 문제 중 하나가 단말의 방향 전환 문제이다.
단말의 방향이 바뀌었을 때는 가로와 세로 화면의 비율에 따라 화면이 다시 보이게 된다.
이는 액티비티가 없어졌다가 다시 생기는 현상이다.
따라서 onCreate() 함수도 다시 호출되며, 이에 따라 가지고 있던 데이터도 초기화된다.
이러한 문제를 처리하는 방식에는 3가지가 있다.
| 액티비티 바뀜 + 가로/세로 레이아웃
가로와 세로 각각의 XML 레이아웃 파일을 생성해두고 화면 방향이 전환될 때,
액티비티는 바뀌면서 방향에 맞는 XML 파일을 화면에 보여주는 방식이다.
res폴더 하위에 layout-land (지정된 이름) 리소스 폴더를 추가하고
여기에 가로 XML 레이아웃 파일을 저장해둔다.
이 때, 세로 XML 파일과 가로 XML 파일명은 동일해야 한다.
| 액티비티 안 바뀜 + 레이아웃
AndroidManifest.xml에서 해당 액티비티에 다음과 같이 추가해준다.
<activity android:name=".MainActivity"
android:configChages="orientation|screenSize|keyboardHidden">
. . .
</activity>
configChanges 속성 값을 설정해주면 액티비티에서 상태 변화를 알 수 있다.
그렇다면 액티비티에서 어떻게 알 수 있을까?
다음과 같은 메서드를 재정의하면 방향 전환 시 호출된다.
@Override
public void onConfigurationChange(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 가로 방향
} else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
// 세로 방향
}
}
따라서 해당되는 방향일 경우 처리하려는 작업을 진행하면 된다.
그렇다면 화면이 전환되기 전에 가지고 있던 데이터는 어떻게 가져올 수 있을까?
다음과 같은 메서드를 재정의하면 된다.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("data", data);
}
방향이 전환될 때 번들 객체 안에 저장하고 싶은 데이터를 저장한다.
@Override
public void onCreate(Bundle savedInstanceState) {
. . .
if(savedInstanceState != null) {
data = savedInstanceState.getString("data");
}
}
방향이 전환이 될 때, onCreate함수가 다시 호출하게 되고
아까 저장했던 데이터가 savedInstanceState 객체 안에 저장되어 있게된다.
따라서 위와 같이 데이터를 가져올 수 있게된다.
| 액티비티 안 바뀜
<activity android:name=".MainActivity"
android:screenOrientation="portrait"> // 세로
<activity android:name=".MainActivity"
android:screenOrientation="landscape"> // 가로
두 개 중에 원하는 방향으로 설정을 해두면, 휴대폰 방향을 전환해도
앱 방향은 고정된 방향으로만 나오게 되는 것을 알 수 있다.
'Mobile > Android' 카테고리의 다른 글
[ Android ] 다이얼로그 띄우기 (0) | 2020.09.06 |
---|---|
[ Android ] 사용자가 원하는 디자인으로 토스트 만들기 (0) | 2020.09.05 |
[ Android ] 안드로이드 무선 디버깅 (adb) (0) | 2020.09.02 |
[ Android ] 앨범에서 사진/동영상 가져오기 (0) | 2020.09.02 |
[ Android ] unable to open debugger port (localhost:8700) (0) | 2020.08.28 |