안녕하세요, 반갑습니다!
모바일 앱을 만들다보면 화면을 돌려야 하는 경우가 있습니다.
이를테면, 게임, 동영상 플레이어 등의 앱이 대표적이겠네요.
그런데 그냥 화면을 돌린다고 앱도 알아서 회전 될까요?
아시다시피 당연히 개발자화면에 대한 이벤트를 처리해줘야만 합니다.
세로와 가로 화면에 맞는 모양과 데이터 처리,
이 이벤트를 제어하는 방법 2가지를 알아보겠습니다!
안드로이드
화면 회전 처리하기
1. Layout.xml 을 각각 만들어 화면 회전 처리하기
이 방법은 아주 간단합니다.
안드로이드 스튜디오는 각 화면을 두 개의 파일로 구성할 수 있습니다.
예를 들어,
크기가 다른 이미지를 단말기 해상도에 따라 보여주기 위해서 그에 맞는 디렉토리를 구분해서 만들었습니다.
drawable 디렉토리를 drawable-xhdpi / drawable-xxhdpi 등으로 따로 만들어 크기가 맞는 이미지를 넣어두는 식이죠.
화면 회전 역시 동일한 방식으로 처리할 수 있습니다.
세로 화면과 가로 화면을 각각 만드는 방법입니다.
아래 이미지 처럼 디렉토리를 구성하게 되면,
layout 은 세로 화면을 관리하는 디렉토리가 됩니다.
layout-land 는 가로 화면을 관리하는 디렉토리가 됩니다.
주의해야 할 사항은 디렉토리명을 분명하게 layout / layout-land 로 해야 합니다.
파일 역시 동일한 이름으로 해야 하는 것도 물론이구요.
그러면 안드로이드 스튜디오는 자동으로 화면 회전에 따라 각 디렉토리에 있는 layout.xml을 보여주는 것이지요.
※ 이 방법은 세로/가로 화면을 각각 다른 모습으로 보여주고 싶을 때 사용하면 좋습니다.
2. 단 하나의 Layout.xml 파일로 코드를 이용해서 화면 처리하기
이 방법은 1번과 달리 단 하나의 Layout.xml 만을 사용합니다.
그러니 처음부터 가로 회면까지 생각해서 디자인 잘~ 해야 합니다.
오직 코드로만 화면회전을 하는 방법입니다.
AndroidManifests.xml 에서 configChanges 속성을 설정해 줍니다.
만약 앱의 모든 액티비티를 회전해야 한다면,
<application></application> 사이에 설정하면 됩니다.
<application
android:configChanges="orientation|screenSize|keyboardHidden">
.
.
생략
하지만 특정 액티비티만 회전해야 한다면,
<activity></activiy>사이에 속성을 입력하면 됩니다.
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden">
.
.
생략
이 configChanges 속성은 화면상태가 변경되면 개발자에게 알려주는 역할을 합니다.
시스템이 자동으로 onConfigurationChanged() 메서드를 호출하지요.
그래서 Override Method 로 구현할 수 있습니다.
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
/**
* 가로 화면일 때 To do
*/
showToast("가로(land) 방향");
}
else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
/**
* 세로 화면일 때 To do
*/
showToast("세로(port) 방향");
}
}
이 방법은 화면이 회전되는 시점을 정확히 알 수 없는 1번 방법에 비해,
회전 시점을 분명하게 알 수 있는 장점이 있습니다.
(에뮬레이터는 방향 전환이 잘 안될 수 있으니 실제 단말기로 확인하는 것이 정확합니다.)
3. 화면회전시, onSaveInstanceState() 로 데이터 보존하기
그런데 화면 회전시 액티비티는 onCreate() 를 호출하게 됩니다.
즉, 액티비티를 '새로' 호출한다는 의미인 것이죠.
데이터는 당연히 사라집니다.
그럼 데이터를 기반으로 하는 화면 역시 제대로 안나오겠죠?
이 데이터를 어떻게 보존할 수 있을까요?
외부 데이터베이스를 이용하거나, 내부 데이터베이스 등을 이용하는 방법도 있습니다.
이 포스팅에서는 onSaveInstanceState() 메서드를 Override 해서 데이터를 저장/복원하는 방법을 설명하겠습니다.
onSaveInstanceState() 는 설정값 등 간단한 데이터를 저장할 때 주로 사용합니다.
아래 코드와 같이 Key와 Value 의 형태로 데이터를 저장할 수 있습니다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
name = savedInstanceState.getString("savedData"); //'savedData' 키로 저장된 값을 가져옵니다.
showToast("복원 되었습니다."); //showToast() 메서드로 토스트를 출력합니다.
}
}
.
.
.
@Override
public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putString("savedData", name); //변수 값 저장
}
감사합니다.