안드로이드 개발 질문/답변
(글 수 45,052)
App의 구성은
TabActivity 에 ActivityGroup을 사용하고 있습니다.
TabActivity -> ActivityGroup -> A Activity(리스트뷰 Item Click) -> B Activity(상세 페이지)
-> (Back button) -> A Activity(리스트뷰 Item Click) -> B Activity 으로 페이지를 이동하는 과정입니다.
2.3 버전 까지는 정상적으로 작동이 되는데
그런데 4.0 이전버전(3.0은 테스트 안해 봤습니다 ^^;)에서는
B Activity 까지는 정상적으로 진행이 되는데 B Activity에서 Back 을 해서
A Activity 로 돌아오면 리스트가 클릭이 되지 않습니다.
ActivityGroup에서 Activity 시작은
public void startChildActivity(String Id, Intent intent) {
Window window = getLocalActivityManager().startActivity(Id,
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
if (window != null) {
mIdList.add(Id);
setContentView(window.getDecorView());
}
else{
Log.w(TAG, "startChildActivity window Null !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
}
Window window = getLocalActivityManager().startActivity(Id,
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
if (window != null) {
mIdList.add(Id);
setContentView(window.getDecorView());
}
else{
Log.w(TAG, "startChildActivity window Null !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
}
이고 "뒤로가기" 는
onBackPress()호출하고 manager에의해 finishFromChild()가 호출 되는 구조입니다.
@Override
public void onBackPressed () {
int length = mIdList.size();
if ( length > 1) {
Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1));
current.finish();
}else{
mIdList.clear();
finish();// 최상위 Level의 경우 TabActvity를 종료해야 한다.
}
public void onBackPressed () {
int length = mIdList.size();
if ( length > 1) {
Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1));
current.finish();
}else{
mIdList.clear();
finish();// 최상위 Level의 경우 TabActvity를 종료해야 한다.
}
@Override
public void finishFromChild(Activity child) {
int index = mIdList.size()-1;
if (index < 1) {
finish();
return;
}
getLocalActivityManager().destroyActivity(mIdList.get(index), true);
mIdList.remove(index);
index--;
String lastId = mIdList.get(index);
//기존 Activity를 불러올 때 Activity 재시작 onCreate가 호출됨..
public void finishFromChild(Activity child) {
int index = mIdList.size()-1;
if (index < 1) {
finish();
return;
}
getLocalActivityManager().destroyActivity(mIdList.get(index), true);
mIdList.remove(index);
index--;
String lastId = mIdList.get(index);
//기존 Activity를 불러올 때 Activity 재시작 onCreate가 호출됨..
//---------
Intent lastIntent = getLocalActivityManager().getActivity(lastId).getIntent();
Window newWindow = getLocalActivityManager().startActivity(lastId, lastIntent);
setContentView(newWindow.getDecorView());
Intent lastIntent = getLocalActivityManager().getActivity(lastId).getIntent();
Window newWindow = getLocalActivityManager().startActivity(lastId, lastIntent);
setContentView(newWindow.getDecorView());
//------------
// 기존 Activity를 불러올때 Activity 재시작 하지 않음 기존 생성되었던 view를 보여줌.
Window newWindow = getLocalActivityManager().getActivity(lastId).getWindow();
setContentView(newWindow.getDecorView());
}
2.3 까지는 finishFromChild 에서 getActivity() 를 사용하여 View만 set해 주어도
리스트 뷰가 클릭 되는데 4.0에서는 View 만 셋팅해 주면 리스트가 클릭이 되지 않습니다.
4.0에서는 주석처리(//-------) 한 부분 처럼 startActivity를 사용하여
View를 셋팅 해주면 클릭 이벤트는 동작을 하는데.
기존에 B Activity로 이동하기 전에 보여주었던 View가 아닌
새로 생성한 View로 보여집니다.(당연한 이야기 이겠지만요.. onCreate() 호출 됨. )
4.0에서 기존 View를 유지 하면서 Click 이벤트가 동작 하도록 할 수는 없을까요??
p.s
3.0 이상 부터 TabActivity, ActvityGroup 이 권장 되지 않는 것으로 압니다
Fragment 를 사용하라고 하는데 요 몇일간 구글링으로 자료를 찾아 보았는데.
TabActivity 까지는 support v4로 어찌어찌 했는데..
그 다음 ActivityGroup 처럼 Activity를 관리하는 구조를 구현하는
부분에서 삽질을 하고 있습니다 ㅡㅡ;
도통 Group 관리하는 부분에서는 어떻게 해야할지 이해가 잘 안됩니다.
혹시 Frgment로 TabActivity+ActivityGroup 형태로 구현할 수 있는 방법을 아시는분 계시면
염치 없지만 lightfly77@gmail.com 로 예제 소스 요청해 봅니다. ^^;;