-
Fragment에서 Back Key Event 처리LANGUAGE/ANDROID 2014. 12. 2. 16:31
Fragment에서 Back키가 눌렸을 때 이를 받아먹고 싶지만,
이게 뜻대로 안 됨. 키 이벤트는 다 액티비티가 받아먹으니까.
그래서 Fragment가 붙어있는 액티비티에다가, (다시말해, Fragment에서 getActivity를 하면 얻을 수 있는 Activity에서)
12345678public interface onKeyBackPressedListener {public void onBack();}private onKeyBackPressedListener mOnKeyBackPressedListener;public void setOnKeyBackPressedListener(onKeyBackPressedListener listener) {mOnKeyBackPressedListener = listener;} // In MyActivity이런 리스너 인터페이스를 만들어주고,
Back 키 이벤트를 받을 Fragment에서 implement 해줌
12345678910@Overridepublic void onBack() {if (mWebView.canGoBack()) {mWebView.goBack();} else {MyActivity activity = (MyActivity) getActivity();activity.setOnKeyBackPressedListener(null);activity.onBackPressed();}} // in SearchFragment그리고 이 Fragment를 리스너로 등록해줌, getActivity로 할 수도 있지만,
onAttach에서 해주면 매개변수로 바로 등록가능
12345@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);((MyActivity) activity).setOnKeyBackPressedListener(this);} // in SearchFragment내 경우, WebView가 들어있는 Fragment이고 웹 브라우저에서 뒤로 갈 수 있는데도 뒤로가기 키를 누르면
Fragment가 종료되어버리는 현상때문에 Fragment에서 BackKey이벤트를 낚아채갈 필요성이 생긴거.
그리고 이게 액티비티의 onBackPressed()임.
12345678@Overridepublic void onBackPressed() {if (mOnKeyBackPressedListener != null) {mOnKeyBackPressedListener.onBack();} else {super.onBackPressed();}} // in MyActivity맨 처음에는 mOnKeyBackPressedListener가 null이기 때문에, (Fragment가 아직 생기지도 않았으니까)
super.onBackPressed()가 실행되지만,
Fragment가 Attach 된 후에는, 이 Fragment가 Listener를 초기화했기 때문에
back key 이벤트를 낚아채올 수 있다. -> 그러다가 뒤로갈 수 없어지면, 리스너 해제해버리고 onBackPressed()해주면 끝!
쓸 데 없이 현재 프래그먼트가 뭔지 저장하고, 스트링 비교하고, 이런거 필요 없이 정말 깔~끔한 코드.
'LANGUAGE > ANDROID' 카테고리의 다른 글
Notification (0) 2015.02.02 invalid project description (0) 2015.01.30 Activity stack 확인 방법 (0) 2015.01.05 onNewIntent 호출을 이용한 내용 변경 (0) 2015.01.05 facebook 로그인시 facebook app이 설치되어 있을때 로그인 창이 사라지는 현상 (0) 2014.12.01