안드로이드 개발 질문/답변
(글 수 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() 로 확인 해보니 이전에 표시되던 뷰는 제대로 받아옵니다.
어디가 문제인지 모르겠네요.
이상하다거나 잘못된 곳 마구마구 지적해주세요~
도움 부탁드립니다 ㅠ ㅠ