은근히 많은 안드로이드 SDK의 버그...
Fragment를 이용하여 화면을 구성할 때,
Fragment를 분명히 hide 시켰는데, hide되지 않는 경우가 있다..
위 Activity에 다음처럼 명령을 주면
1. add - Fragment A
2. add - Fragment B
3. hide - Fragment A
기대하는 결과는
....
하지만 현실은
젠장... 왜 -_-;; 난 hide를 분명 했단 말이다!!
현재까지의 버전(젤리빈 4.2.2, Android support pack rev 13) 에서 이 문제를 해결하기 위해서는
1. Fragment A 의 현란한 애니메이션을 삭제 -> 까이꺼 날려버려~
2. Fragment B 에서 수동으로 attach / detach -> state까지 기억해야돼.. 귀찮아 ㅜㅜ
을 해야 한다.
1번은 간단히
2번은 간단히... (진정 간단하냐....?? 정말?)
public class FragmentB extends Fragment {
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
FragmentManager fm = getActivity().getSupportFragmentManager();
if (hidden) {
fm.beginTransaction().detach(this).commit();
} else {
fm.beginTransaction().attach(this).commit();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
//내위치는 어디고,
//선택은 뭐가 되었고,
//사용자가 입력은 뭘 했구만..
//오키~ 저장완료
super.onSaveInstanceState(outState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
if (savedInstanceState != null) {
//위치를 다시 옮기고
//선택을 다시 해주고
//입력한거 다시 입력해주고
//짜잉나! -_-;;
}
...
}
}
간단하죠?
...
(돌 던지지 마세요... )
그래서 개선 했어요 ㅡㅡㅋ
public class FragmentC extends Fragment {
private View mContentsView;
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
FragmentManager fm = getActivity().getSupportFragmentManager();
if (hidden) {
fm.beginTransaction().detach(this).commit();
} else {
fm.beginTransaction().attach(this).commit();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (mContentsView == null) {
mContentsView = inflater.inflate(....);
} else {
ViewParent parent = mContentsView.getParent();
if (parent != null && parent instanceof ViewGroup) {
((ViewGroup)parent).removeView(mContentsView);
}
return mContentsView;
}
}
끝~
댓글 없음:
댓글 쓰기