티스토리 뷰
몇몇 기기 구성은 프로그램 실행 중에 변경될 수 있다. (예: 화면 방향 전환, 키보드 가용성 및 언어 변경)
이러한 변경이 일어나는 경우 안드로이드는 액티비티를 다시 실행시키게 된다. 쉡게 말하면 수명주기 중에서 destroy가 호출되고 다시 실행되면서 onCreate를 다시 호출하는 것이다.
이 같은 상황을 '특정 구성에 대한 변경'이라 칭하고 정리하겠다.
안드로이드는 특정 구성 변경에 대해 직접 처리 할 수 있는 선택지로 configchanges라는 activity의 속성을 제공한다.
그러나 configchanges의 사용은 시스템이 리소스의 재구성을 도와주지 않기 때문에 특정 구성 변경으로 인한 재시작을 반드시 피해야 하는 경우가 아니라면 사용하지 않는 것이 좋다.
androidManifest.xml
<activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
이를 적용하면 configchanges의 값에 포함되는 구성이 변경 되어도 더이상 MainActivity는 다시 재시작을 하지 않는다.
그 대신, void onConfigurationChanged(Configuration newConfig) 구성 변경 후 이 메서드가 자동으로 호출된다. 즉 이 메서드를 오버라이딩 해야 한다.
이 메서드의 매개 변수 타입인 Configuration은 새 기기 구성을 나타내며 Configuration의 필드를 읽어보면 새 구성을 판별할 수 있고 이를 판단해서 적절한 변경을 취할 수 있다.
다음은 configchanges를 테스트 해보는 코드이다.
방향이 전환이 되면 onConfigurationChanged메서드를 호출하며, 방향이 전환되었다는 토스트 메세지를 보여준다.
androidManifest.xml
<activity android:name=".FocusActivity" android:configChanges="orientation|screenSize|layoutDirection"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
FocusActivity.java
public class FocusActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_focus); Toast.makeText(this, "onCreate메서드가 호출되었습니다.", Toast.LENGTH_SHORT).show(); final Window win = getWindow(); win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig);
if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){ Toast.makeText(this, "가로방향이됨", Toast.LENGTH_SHORT).show(); }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ Toast.makeText(this, "세로방향이됨", Toast.LENGTH_SHORT).show(); } } }
activity_focus.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.choonie.eventapplication.FocusActivity"> <Button android:id="@+id/showButton" android:layout_width="160dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:background="@drawable/selector_ex" android:textSize="20dp" /> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/selector_ex" android:hint="텍스트를 입력하세요." android:textSize="20dp" /> </LinearLayout>
'Android > 정리' 카테고리의 다른 글
SeekBar (0) | 2016.08.04 |
---|---|
WebView사용하기 (웹뷰) (0) | 2016.06.14 |
android selector xml 사용 (뷰를 터치시 색상 효과 주기) (0) | 2016.06.10 |
이벤트 처리 (0) | 2016.06.08 |
알림 대화상자 띄우기 (0) | 2016.05.28 |