안드로이드 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 를 독립적으로 구현할 수 있습니다.
'프로그래밍 > Android' 카테고리의 다른 글
Spring For Android, Rest Client 를 사용한 서버와의 통신 (0) | 2013.09.04 |
---|---|
안드로이드 Loader 활용하기 (0) | 2013.09.02 |
안드로이드 이미지 캐쉬하기 (0) | 2013.08.30 |
안드로이드 비동기 처리하기 AsyncTask (0) | 2013.08.30 |
안드로이드 큰 이미지를 효율적으로 로드하는 방법 (0) | 2013.08.30 |