안드로이드 Fragment 활용하기

프로그래밍/Android 2013. 8. 28. 10:48

안드로이드 Fragment 활용하기


Fragments

- Fragment 는 Activity 의 사용자 인터페이스를 구성하는 한 부분이며 Activity 는 여러개의 Fragment 를 조합하여 multi-pane UI 를 구성할 수 있다.

- Fragment 는 자기 자신의 lifecycle 을 갖으며 Activity 의 lifecycle에 영향을 받는다.

- Fragment 는 Activity 내에 embeded 되며 Fragment 는 자신의 layout을 정의한다.



Fragment 생성

public class ArticleFragment extends Fragment{

  // Fragment 의 layout 을 설정하기 위해서는 onCreateView() 메소드를 사용한다.

public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

return inflater.inflate( R.layout.article_view, container, false);

}

}



Activity 에 Fragment 추가하기

- 런타임시에 Activity 에 Fragment 를 추가하기 위해서는 FragmentManager, FragmentTransaction 을 사용한다.

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// add 메소드의 첫번째 파라미터로는 해당 Fragment 가 포함될 ViewGroup 을 나타냅니다.

transaction.add(R.id.fragment_container, firstFragment);

// Fragment 의 변경이 있은 후에는 반드시 commit() 메소드를 호출하여 변경사항을 반영해 줍니다.

transaction.commit();



Fragment 간의 통신

- Activity 내의 각각의 Fragment 는 서로간의 통신을 하기 위해서는 반드시 Activity 를 거쳐야 한다. 다른 Fragment 의 존재를 알 수 없기 때문이다.

- Activity 는 getSupportFragmentManger().findFragmentById() 명령어를 통해 Activity 내의 모든 fragment 에 접근이 가능하다.

- Fragment 는 onAttach() 이벤트시에 Activity 에 대한 참조를 얻을 수 있다. 따라서 각각의 Fragment 는 이벤트시에 Activity 의 메소드를 호출 할 수 있다.

- 이렇게 할 경우 각각의 Fragment 의 독립성을 유지 할 수 있다. 


onAttach() 시에 Activity 에 대한 참조 획득

public class HeadlinesFragment extends ListFragment {

    OnHeadlineSelectedListener mCallback;


    // Container Activity must implement this interface

    public interface OnHeadlineSelectedListener {

        public void onArticleSelected(int position);

    }


    @Override

    public void onAttach(Activity activity) {

        super.onAttach(activity);

        

        // This makes sure that the container activity has implemented

        // the callback interface. If not, it throws an exception

        try {

            mCallback = (OnHeadlineSelectedListener) activity;

        } catch (ClassCastException e) {

            throw new ClassCastException(activity.toString()

                    + " must implement OnHeadlineSelectedListener");

        }

    }

    

    ...

}



클릭 이벤트 발생시 Activity 의 메소드 호출

// Fragment 의 리스트 목록을 클릭했을 때 호출되는 메소드

@Override

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

// Send the event to the host activity

mCallback.onArticleSelected(position);

}



Activity 에서는 onArticleSelected 에서 다른 Fragment, ArticleFragment 의 메소드 호출

public static class MainActivity extends Activity

        implements HeadlinesFragment.OnHeadlineSelectedListener{

    ...


    public void onArticleSelected(int position) {

        // The user selected the headline of an article from the HeadlinesFragment

        // Do something here to display that article

  

  // Activity 내어서는 getSupportFragmentManager() 메소드를 통해 FragmentManger 에 접근 가능하다.

        ArticleFragment articleFrag = (ArticleFragment)getSupportFragmentManager().findFragmentById(R.id.article_fragment);


        if (articleFrag != null) {

            // If article frag is available, we're in two-pane layout...


            // Call a method in the ArticleFragment to update its content

            articleFrag.updateArticleView(position);

        } else {

            // Otherwise, we're in the one-pane layout and must swap frags...


            // Create fragment and give it an argument for the selected article

            ArticleFragment newFragment = new ArticleFragment();

            Bundle args = new Bundle();

            args.putInt(ArticleFragment.ARG_POSITION, position);

            newFragment.setArguments(args);

        

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();


            // Replace whatever is in the fragment_container view with this fragment,

            // and add the transaction to the back stack so the user can navigate back

            transaction.replace(R.id.fragment_container, newFragment);

            transaction.addToBackStack(null);


            // Commit the transaction

            transaction.commit();

        }

    }

}


: