안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
날씨가 한겨울 뺨칠만큼 춥네요.
감기 조심하시고 이미 감기이신 분들은 얼른 나으시길...(저도 감기... 훌쩍... ㅡ.ㅜ)
일정관리 앱을 만들어보려고 하는데요,
다른 기능을 더 넣어보려고 우선 일정표시관련 액티비티들 뷰로 만들어 SubMain 이라는 액티비티의
FrameLayout 에 addView 하는 형식으로 묶어놓았습니다.
각 액티비티의 이동은 탭이랑 비슷하게 위쪽에 버튼을 만들어서 움직이도록 했구요.
일정을 추가하는 기능은 별도 액티비티로 만들어서 호출하고 저장 후 닫는 식입니다.
문제는 이 일정을 추가하는 액티비티가 나왔다가 사라진 후 이전 액티비티, 그러니까 SubMain 액티비티로 다시 넘어오는데
일정 추가 이전에 표시되었던 화면이 사라져버리고 없습니다. ㅇㅁㅇ!!!
그렇다고 모든 경우에서 다 사라지는건 아니고... 현재 리스트 보기, 주간 보기, 월간 보기의 3개 액티비티를 FrameLayout 에
넣었습니다. 월간 보기에서 일정을 추가하거나 삭제하면 정상적으로 갱신이 되어서 표시가 되는데
리스트나 주간보기에서 일정 추가나 삭제를 하면 화면이 사라져버리네요.
다른 액티비티를 호출하기 전에 표시되고 있는 액티비티의 뷰를 저장해서 onResume 호출시에 setVisibility 로 visible 시켜주고
requestFocus 로 포커스도 앞으로 가져오는데 이상하게 월간 보기 말고는 제대로 다시 표시가 안됩니다. ㅠ ㅠ
아래는 SubMain 의 소스입니다.
onResume 에서 beforeView.getContext() 로 확인 해보니 이전에 표시되던 뷰는 제대로 받아옵니다.
어디가 문제인지 모르겠네요.
이상하다거나 잘못된 곳 마구마구 지적해주세요~
도움 부탁드립니다 ㅠ ㅠ
날씨가 한겨울 뺨칠만큼 춥네요.
감기 조심하시고 이미 감기이신 분들은 얼른 나으시길...(저도 감기... 훌쩍... ㅡ.ㅜ)
일정관리 앱을 만들어보려고 하는데요,
다른 기능을 더 넣어보려고 우선 일정표시관련 액티비티들 뷰로 만들어 SubMain 이라는 액티비티의
FrameLayout 에 addView 하는 형식으로 묶어놓았습니다.
각 액티비티의 이동은 탭이랑 비슷하게 위쪽에 버튼을 만들어서 움직이도록 했구요.
일정을 추가하는 기능은 별도 액티비티로 만들어서 호출하고 저장 후 닫는 식입니다.
문제는 이 일정을 추가하는 액티비티가 나왔다가 사라진 후 이전 액티비티, 그러니까 SubMain 액티비티로 다시 넘어오는데
일정 추가 이전에 표시되었던 화면이 사라져버리고 없습니다. ㅇㅁㅇ!!!
그렇다고 모든 경우에서 다 사라지는건 아니고... 현재 리스트 보기, 주간 보기, 월간 보기의 3개 액티비티를 FrameLayout 에
넣었습니다. 월간 보기에서 일정을 추가하거나 삭제하면 정상적으로 갱신이 되어서 표시가 되는데
리스트나 주간보기에서 일정 추가나 삭제를 하면 화면이 사라져버리네요.
다른 액티비티를 호출하기 전에 표시되고 있는 액티비티의 뷰를 저장해서 onResume 호출시에 setVisibility 로 visible 시켜주고
requestFocus 로 포커스도 앞으로 가져오는데 이상하게 월간 보기 말고는 제대로 다시 표시가 안됩니다. ㅠ ㅠ
아래는 SubMain 의 소스입니다.
public class SubMain extends ActivityGroup {
static final int MONTH_VIEW = 1;
static final int WEEK_VIEW = 2;
static final int DAY_VIEW = 3;
static final int LIST_VIEW = 4;
private LocalActivityManager LAM;
private Window wCalendar, wWeekView, wListView;
private View beforeView = null, vCalendar, vWeekView, vListView;
//Button btnCalendar, btnPicture, btnVideo, btnOption, btnShop;
private ImageButton listView, dayView, weekView, monthView;
private ImageButton addSchedule;
private FrameLayout frame;
private RelativeLayout topButtonSet;
private int nStatus = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.submain);
frame = (FrameLayout)findViewById(R.id.actSwitch);
// 상단 버튼
topButtonSet = (RelativeLayout)findViewById(R.id.topButtonSet);
listView = (ImageButton)findViewById(R.id.topList);
weekView = (ImageButton)findViewById(R.id.topWeek);
monthView = (ImageButton)findViewById(R.id.topMonth);
listView.setOnClickListener(bListener);
weekView.setOnClickListener(bListener);
monthView.setOnClickListener(bListener);
addSchedule = (ImageButton)findViewById(R.id.addSchedule);
addSchedule.setOnClickListener(bListener);
setSub();
if(savedInstanceState == null) {
beforeView = vCalendar;
beforeView.setTag("MONTH");
}
beforeView.setVisibility(View.VISIBLE);
beforeView.requestFocus(View.FOCUS_FORWARD);
}
// 화면 구성
public void setSub(){
Intent intent = new Intent();
LAM = getLocalActivityManager();
//리스트
intent.setClass(this, SchList.class);
wListView = LAM.startActivity("ListView", intent);
vListView = wListView.getDecorView();
vListView.setVisibility(View.INVISIBLE);
// 주간
intent.setClass(this, WeekView.class);
wWeekView = LAM.startActivity("WeekView", intent);
vWeekView = wWeekView.getDecorView();
vWeekView.setVisibility(View.INVISIBLE);
// 월간
intent.setClass(this, Calender.class);
wCalendar = LAM.startActivity("Calender", intent);
vCalendar = wCalendar.getDecorView();
vCalendar.setVisibility(View.INVISIBLE);
// 프레임에 뷰 추가
frame.addView(vCalendar);
frame.addView(vWeekView);
frame.addView(vListView);
if(beforeView != null){
beforeView.setVisibility(View.VISIBLE);
beforeView.requestFocus(View.FOCUS_FORWARD);
}
}
Button.OnClickListener bListener = new Button.OnClickListener(){
Intent intent;
public void onClick(View v){
switch(v.getId()){
/*==================상단 버튼============================ */
case R.id.addSchedule : // 일정 추가
intent = new Intent(SubMain.this, AddSchedule.class);
startActivity(intent);
break;
case R.id.topList :
hideBefore();
vListView.setVisibility(View.VISIBLE);
vListView.requestFocus(View.FOCUS_FORWARD);
beforeView = vListView;
beforeView.setTag("LIST");
break;
case R.id.topWeek :
hideBefore();
vWeekView.setVisibility(View.VISIBLE);
vWeekView.requestFocus(View.FOCUS_FORWARD);
beforeView = vWeekView;
beforeView.setTag("WEEK");
break;
case R.id.topMonth :
hideBefore();
vCalendar.setVisibility(View.VISIBLE);
vCalendar.requestFocus(View.FOCUS_FORWARD);
beforeView = vCalendar;
beforeView.setTag("MONTH");
break;
}
}
};
// 캘린더 상단 버튼 숨기기
public void hideTopButton(){
topButtonSet.setVisibility(View.GONE);
}
// 캘린더 상단 버튼 보이기
public void showTopButton(){
topButtonSet.setVisibility(View.VISIBLE);
}
// 이전 뷰 숨기기
public void hideBefore(){
beforeView.setVisibility(View.INVISIBLE);
beforeView.clearFocus();
}
public void onDestroy(){
super.onDestroy();
Log.v("SubMain", "in onDestroy");
}
public void onStop(){
super.onStop();
Log.v("SubMain", "in onStop");
}
public void onStart(){
super.onStart();
Log.v("SubMain", "in onStart");
}
public void onPause(){
super.onPause();
Log.v("SubMain", "in onPause");
}
public void onResume(){
super.onResume();
Log.v("SubMain", "in onResume , beforeView = " + beforeView.getContext());
frame.removeAllViews();
setSub();
//beforeView.setVisibility(View.VISIBLE);
//beforeView.requestFocus(View.FOCUS_FORWARD);
}
public void onRestart(){
super.onRestart();
Log.v("SubMain", "in onRestart");
}
}onResume 에서 beforeView.getContext() 로 확인 해보니 이전에 표시되던 뷰는 제대로 받아옵니다.
어디가 문제인지 모르겠네요.
이상하다거나 잘못된 곳 마구마구 지적해주세요~
도움 부탁드립니다 ㅠ ㅠ



