=======================
=======================
=======================
안드로이드폰은 화면 회전이 지원된다.
키보드를 열거나 닫으면 가로보기/세로보기로 전환이 되는데,
이때 UI가 새로 그려지면서 Activity의 onDestroy()와 onCreate() 가 수행된다.
위 과정이 수행되고 나면,
Activity 에서 가지고 있었던 변수들(field 도 포함)이 초기 상태로 된다.
만약, 코드에서 Thread를 만들어 돌아가는 중이었다면,
화면 회전을 한 후에는 사라지는 현상이다.
해결방법은 아래를 클릭...
[닫기...]
[CODE type="java"]/**
Activity소스코드를 보면, 타입이 HashMap<String, Object>이고, null 을 리턴하고 있다.
유지해야할 데이터가 한개라면 그 Object를 바로 리턴해도 된다. */
@Override
public Object onRetainNonConfigurationInstance() {
[tab]HashMap<String, Object> map = new HashMap<String, Object>();
[tab]map.put("worker", worker);
[tab]map.put("var1", var1);
[tab]map.put("var2", var2);
[tab]return map;
}
}
/**
onCreate의 적당한 부분에 이전 데이터를 복원하는 코드를 넣어준다.
여기에서는 restore() 를 따로 정의했다. */
@Override
public void onCreate(Bundle savedInstanceState) {
[tab]super.onCreate(savedInstanceState);
[tab]...
[tab]...
[tab]restore();
[tab]...
[tab]...
}
/**
이전 데이터를 복원한다 */
@SuppressWarnings("unchecked")
private void restore() {
[tab]Object o = getLastNonConfigurationInstance();
[tab]if(o!=null){
[tab][tab]//Map형태로 리턴했기때문에 casting 해서 사용한다.
[tab][tab]HashMap<String, Object>map = (HashMap<String, Object>) o;
[tab][tab]this.worker = (Thread) map.get("worker");
[tab][tab]this.var1 = (String) map.get("var1");
[tab][tab]this.var2 = (String) map.get("var2");
[tab]}
}[/CODE]
화면이 회전되거나 종료가 될때, onDestroy()가 호출되는데,
다음과 같이 구분해서 종료될때의 처리를 해 줄 수 있다.
[CODE type="java"]@Override
protected void onDestroy() {
[tab]Log.d(tag, "onDestroy" + " isFinishing : " +isFinishing());
[tab]if(isFinishing()){
[tab][tab]//isFinishing()은 진짜로 프로그램이 종료될때는 true 값이다.
[tab][tab]// 회전할때는 당연히 false
[tab][tab]worker.interrupt();
[tab][tab]worker=null;
[tab]}
[tab]super.onDestroy();
}[/CODE]
[닫기...]
=======================
=======================
=======================
출처: http://starkapin.tistory.com/184
안 드로이드에서 PORTRAIT, LANDSCAPE 두가지 모드로 작업을 진행해야 할 때가 있다. 나는 무조건 단방향모드만 지원할꺼야 라고 기획을 잡아놓으면 이 두가지 상황중 하나만 설정을 해 놓으면 된다. 그러면 조건에 맞춰 어떻게 사용해야 할지를 살펴보자.
1
2
3
4
5
6
|
< activity android:name = ".index" android:label = "@string/app_name" android:screenorientation = "landscape" android:theme = "@android:style/Theme.NoTitleBar.Fullscreen" > < intent-filter > < action android:name = "android.intent.action.MAIN" > < category android:name = "android.intent.category.LAUNCHER" > </ category ></ action ></ intent-filter > </ activity > |
1
2
3
|
WindowManager wm = getWindowManager(); if (wm == null ) return ; setOrientation(wm.getDefaultDisplay().getOrientation()); // 자체 메소드 |
1
2
3
4
5
6
7
8
9
|
if (m_isLandscape == 0 ) { // Portrait mode, Nothing change previous version setContentView(R.layout.reservation_setting_layout); mMainlayout = (RelativeLayout) this .findViewById(R.id.MainLayout); } else { // Landscape mode, call another layout setContentView(R.layout.reservation_date_land_layout); mLMainlayout = (LinearLayout) this .findViewById(R.id.MainLayout); } |
1
2
3
4
5
6
7
8
9
|
@Override public void onConfigurationChanged(Configuration newConfig) { super .onConfigurationChanged(newConfig); // 다시 setOrientation()을 호출한다. WindowManager wm = getWindowManager(); if (wm == null ) return ; setOrientation(isLandscape); } |
=======================
=======================
=======================
=======================
=======================
=======================
출처: 여기
메인부분에서 화면 고정을 해도 기기에 따라 기기에 설정된 로테이트가 설정된뒤
화면이 바끼는 경우가 있다 특히 메인 액티브티 화면뷰어 같은경우 문제가 된다.
그러므로 회전에 영향이 가는 뷰어부분은 onDestroy()와 onCreate() 에 안의 api
들이 있다면 신경써주어야 한다.
=======================
=======================
=======================