안드로이드 Fragment에서 Activity 와 통신하기

프로그래밍/Android 2013. 9. 2. 00:27

안드로이드 Fragment에서 Activity 와 통신하기


Fragment 는 여러 Activity 에서 사용될 수 있으므로 Activity 에 독립적으로 구현되어야 합니다.

Fragment 는 getActivity() 메소드로 Attach 되어 있는 Activity 를 가져올 수 있습니다.


Activity 로 이벤트 콜백 메소드 만들기

Fragment 내에서 발생하는 이벤트를 Activity 와 공유하기 위해서는 Fragment 에서 이벤트 콜백 인터페이스를 정의하고 Activity 에서 그 인터페이스를 구현해야 합니다.


예를 들면

Activity 내에 두개의 Fragment 가 있고, 하나는  최신기사의 제목 목록을 보여주는 ListFragment 이고  다른 Fragment 는 선택된 기사의 상세내용을 보여주는 DetailFragment 입니다.

사용자가 ListFragment에서 최신기사의 제목을 선택했을 때 선택한 선택된 기사의 상세 내용을 보여주기 위해서는 선택됬다는 이벤트를 DetailFragment에서 알아채야 합니다.


이때 가장 쉽게 생각할 수 있는 방법은 

ListFragment 에서 사용자가 선택 했을때 DetailFragment 를 바로 호출하는 방법입니다.

DetailFragment detailFrag = (DetailFragment)getActivity().getFragmentManager().findFragmentById( ... );

detailFrag.viewArticle(...)


Fragment 에서는 Activity 를 가져올 수 있는 getActivity() 메소드가 존재하기 때문에 위처럼 작성하는 것도 가능합니다.

그럼 위 코드의 문제점은 뭘까요? ListFragment가 기사를 보여주는 DetailFragment 와 연관되어 있기 때문에 ListFragment 는 재사용이 가능하도록 독립적으로 설계되지 않았습니다.


그럼 ListFragment 가 홀로 설수 있는 방법은 무엇을 까요?

1. ListFragment 내에 이벤트 인터페이스를 정의합니다.

public interface OnArticleSelectedListener {

        public void onArticleSelected(Uri articleUri);

}



2. Activity 에서 Fragment 의 이벤트 인터페이스를 구현합니다.

... Activity implements ListFragment.OnArticleSelectedListener{

...

public void onArticleSelected(Uri articleUri){

// DetailFragment 를 가져와서 이벤트를 처리합니다.

DetailFragment detailFrag = (DetailFragment)getFragmentManager().findFragmentById( ... );

detailFrag.viewArticle(...)

}

}



3. ListFragment 에서 Activity 에 대한 참조를 얻습니다.

Fragment는 onAttach lifecycle 콜백함수에서 Activity 에 대한 참조를 얻을 수 있습니다.

    OnArticleSelectedListener mListener;

    @Override

    public void onAttach(Activity activity) {

        super.onAttach(activity);

        try {

            mListener = (OnArticleSelectedListener) activity;

        } catch (ClassCastException e) {

            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");

        }

    }



4. ListFragment 의 이벤트 콜백 함수에서 Activity 에서 인터페이스를 구현한 이벤트 콜백 함수를 호출합니다.

    @Override

    public void onListItemClick(ListView l, View v, int position, long id) {

        // Send the event and Uri to the host activity

        mListener.onArticleSelected(noteUri);

    }



복잡하지만 Fragment 와 Activity 중간에 인터페이스를 두어 Fragment 를 독립적으로 구현할 수 있습니다.

: