앱 만들기/안드로이드

안드로이드의 기술 #Fragment 백키 처리하기.

나도 처음이야 2020. 9. 8.

Fragment 에서는 H/W 백키 이벤트가 불릴 시

onBackPress() 함수가 실행되지 않는다. 즉, 오버라이딩 할 수 없는 기본 구조이다.

그럼, 어떻게 할 것 인가?

1. Fragment 에 onBackPressed() 라는 함수를 만든다.

필자는 백버튼 처리 함수를 만들고

하기 처럼 MainActivity.finish() 함수를 호출하여 앱을 종료하게 만들었습니다.

 

1
2
3
4
5
6
7
8
9
10
 
 
    // 백버튼에 대한 처리를 한다.
    @Override
    public void onBackPressed() {
        // 부모 Acitivity 얻어오기
        Log.d("test""### Fragment onBackPressed");
        MainActivity activity = (MainActivity)getActivity();
        activity.finish();
    }
cs

 

엥? 콜백 함수가 없는데... 어떻게 호출이 되느냐구요? 

바로, 프래그먼트에 우리가 만든 인터페이스를 인플리먼트 해 주기 때문에 가능한 것 이죠.

 

2. Interface 만들기.

1
2
3
4
5
6
7
public class ResultFragment extends Fragment implements OnBackPressedListener{
 
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
 
cs

 

 

인터페이스 내용은 하기 처럼, onBackPressed() 라는 함수의 선언 부만 적어줍니다.

OnBackPressedListener 인터페이스를 구현한 프래그먼트에선 당연히 onBackPressed() 를

오버 라이딩 해야되는 구조가 성립된 것입니다. 

 

1
2
3
4
5
// 프로그래먼트 백 버튼을 만들기 위해서.
public interface OnBackPressedListener {
    void onBackPressed();
}
 
cs

 

3. MainActivity OnBackPressed() 함수 오버라이딩 하기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 백 버튼 처리 하기.
    @Override
    public void onBackPressed() {
      //  super.onBackPressed();
// 원하는 프래그먼트를 불러온다.
        Fragment test = getSupportFragmentManager().findFragmentById(R.id.container);
        if(test != null){
// 해당 프래그먼트의 백함수를 실행한다.
            ((OnBackPressedListener)test).onBackPressed();
        }else{
            finish();
        }
    }
cs

 

그럼, 해당 프래그먼트를 품고 있는 부모 MainActivity 에서 OnBackPressed() 함수를 오버라이딩 합니다.

내용은 위와 같이

자신이 원하는 프래그먼트 내 OnBackPressed() 함수를 실행하는 구조 입니다. 

OnBackPressedListener 인터페이스를 구현하고 있기에

((OnBackPressedListener)test).onBackPressed(); 구문이 가능하게 됩니다.

 

사실, 여러개의 Fragment 에서 각자 다르게 백 버튼 처리를 해주고 싶다면

위 코드를 유용하게 활용하면 되겠습니다.

감사합니다.

 

반응형

댓글