물에 살고싶은 개발자

Fragment에 뒤로가기 callback 액비티에서 가져오기 본문

Android

Fragment에 뒤로가기 callback 액비티에서 가져오기

돼지사랑 2017. 9. 5. 15:08

확인해보면 알겠지만 프래그먼트 클래스엔 뒤로가기 콜백메서드(onBackPressed())가 없다.

그래서 뒤로가기를 할려면 별도의 로직이 필요한데 그 방법을 포스팅해두려 한다.



1. 프래그먼트를 띄워줄 액티비티 클래스에서 인터페이스를 준비한다.

public interface onKeyBackPressedListener{
void onBackKey();
}


2.마찬가지로 해당 액티비티 클래스에서 밑작업을 세팅 

private onKeyBackPressedListener mOnKeyBackPressedListener;

public void setOnKeyBackPressedListener(onKeyBackPressedListener listener){
mOnKeyBackPressedListener = listener;
}



3.액티비티의 콜백메서드(onBackPressed())에서 로직 세팅

//Fragment 로 뒤로가기 callback 보내기위한 로직
if (mOnKeyBackPressedListener != null) {
mOnKeyBackPressedListener.onBackKey();
}else{
super.onBackPressed();
}

이걸로 액티비티에서의 준비는 끝났다.


4.프래그먼트의 생명주기중 하나를 오버라이드해서 콜백을 떙겨오는 로직을 수행시킨다(난 OnAttach에서 함)

@Override
public void onAttach(Context context) {
super.onAttach(context);

//메인뷰 액티비티의 뒤로가기 callback 붙이기
((MainViewActivity)context).setOnKeyBackPressedListener(this);
}


5. 프래그먼트 클래스에서 위에서 만든 인터페이스를 상속받는다.

public class MainFragment extends Fragment implements MainViewActivity.onKeyBackPressedListener


6. 인터페이스를 상속받았으니 이제 필수로 구현해야하는 메서드를 구현해주자.

@Override
public void onBackKey() {
MainViewActivity activity = (MainViewActivity) getActivity();

//액티비티의 콜백을 직접호출
activity.onBackPressed();
}


3번에서 눈치챈 사람도 있겠지만, 이렇게 구현해두면 뒤로가기를 눌렀을때 액티비티에서 콜백메서드가 호출되면서 프래그먼트 클래스에서 원하는 로직을 수행하게 할 수 있다.


7.그런데 위 방식으로만 수행 할 경우에 프래그먼트의 onBackKey()이 무한호출된다. 이유는 위에 액티비티 콜백메서드의 로직이 객체!=null 일경우에 onBackKey()을 호출하기 때문인데, 이를 위해서 액티비티 콜백메서드를 호출해주기전에 리스너를 비워주자

//뒤로가기 콜백 리스너를 해제
activity.setOnKeyBackPressedListener(null);

상황에 따라서 액티비티쪽의 로직을 바꿀수도있고, 프래그먼트쪽을 바꿔줄수도있다.

각자 처한 상황에 맞게 활용하자

이건 어디까지나 프래그먼트에서 콜백을 호출하는게 아니고 액티비티가 콜백을 받앗을때 프래그먼트에서 가로채 중간에서 로직수행 이후 액티비티에게 돌려주는것이다.


순서로 따지자면 


뒤로가기 터치 -> 액티비티가 감지, 콜백메서드(onBackPressed())호출 -> 프래그먼트 유무 체크 -> (프래그먼트가 있을경우) 프래그먼트측 로직 수행 후 프래그먼트 해제(바로 위에 코드) -> 액티비티의 콜백메서드(onBackPressed())를 호출 -> 프래그먼트 유무 체크 ->(프래그먼트 해제됨) 본래의 역할을 수행(즉 뒤로가기 및 종료) 


이렇게 흐른다는 것을 인지하고 사용하자


추가로, 출처에서도 말하고있지만, 이 방법이 꼭 뒤로가기 콜백에만 국한된것이 아니다.

다른 콜백을 불러올때도 사용될 수 있으니 익혀두면 여러모로 편할거라고 생각한다.



출처 : http://uareuni.tistory.com/36

Comments