프레그먼트 UI 컴포넌트들(components)을 재사용하기 위해서는, 프레그먼트 자신의 레이아웃과 동작을 정의한 완전히 독립적인 모듈로서 구성요소를 만들어야 합니다. 이렇게 프레그먼트를 재사용하도록 정의하면, 액티비티와 프레그먼트들을 조합할 수 있으며 전체적으로 복합 UI를 실현하기 위한 어플리케이션 로직을 가지고 프레그먼트들을 연결할 수 있습니다.
종종 여러분은 다른 것들과 커뮤니케이션을 하는 프레그먼트를 원할 수도 있습니다. 사용자의 이벤트를 기반으로 내용을 변경하는 경우가 있을 수 있게죠. 모든 프레그먼트 대 프레그먼트(fragment-to-fragment) 간의 통신(communication)은 액티비티와의 조합을 통해서 이루어 집니다. 두개의 프레그먼트들은 절대로 다이렉트로 통신을 할 수 없습니다.
인터페이스 정의 (Define an Interface)
-------------------------------
프레그먼트가 액티비티와 통신을 하도록 하기 위해, 여러분은 프레그먼트 안에 인터페이스를 정의할 수 있으며 액티비티안에도 그것을 구현할 수 있습니다. 프레그먼트는 본인의 라이프사이클(lifecycle) 메소드인 onAttach() 에서 인터페이스(interface)을 붙잡도록 구현합니다. 그리고 액티비티와 통신하기 위해 인터페이스 메소드를 호출할 수 있습니다.
아래는 액티비티에게 통신을 하는 프레그먼트의 예제입니다.
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"); } }
... } |
이제 프레그먼트는 OnHeadlineselectedListener 인터페이스인 mCallback 인스턴스(instance)를 사용하여onAriticleSelected() 메소드를( 또은 인터페이스안에 있는 다른 메소드들) 호출함으로서 액티비티에게 메세지를 전달할 수 있습니다.
예들들어, 프레그먼트안에 있는 아래의 메소드는 사용자가 list 아이템을 클릭했을 때 호출됩니다. 프레그먼트는 부모 액티비티에게 이벤트를 전달하기 위해 callback 인터페이스를 사용합니다.
@Override public void onListItemClick(ListView l, View v, int position, long id) { // Send the event to the host activity mCallback.onArticleSelected(position); } |
인터페이스 구현 ( implement the Interface )
-------------------------------------
프레그먼트로 부터 콜백(callback) 이벤트를 받기 위해서, 호스트 액티비티는 반드시 프레그먼트 클래스 안에 정의되어 있는 인터페이스를 구현해야만 합니다.
예를 들어, 아래 액티비티는 위의 예제에 있는 인터페이스를 구현한 것입니다.
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 } } |
프레그먼트에게 메세지 전달하기
( Deliver a Message to a Fragment )
-------------------------------
호스트(host) 액티비티는 findFragmentById()를 통해 프레그먼트(Fragment) 인스턴스(instance)를 참조함으로서 프레그먼트에게 메세지를 전달할 수 있습니다. 그런다음, 직접적으로 프레그먼트의 public 메소드들을 호출합니다.
액티비티가 위의 콜백(callback) 메소드안에 리턴된(returned) 데이터에 의해 쓰여진 아이템을 보여주기 위해 사용되어지는 또 다른 프레그먼트가 포함되어 있다고 생각해 보겠습니다. 이런 경우, 액티비티는 아이템을 보여주기 위한 다른 액티비티에게 콜백메소드안에 받았던 정보를 전달할 수 있습니다.
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 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(); } } } |
'Android 개발자사이트 튜토리얼' 카테고리의 다른 글
SharedPreference : Key - Value 세트로 저장하기 (Saving Key-Value Sets) (0) | 2015.03.31 |
---|---|
데이터 저장하기(Saving Data) (0) | 2015.03.30 |
플렉시블한(동적인) UI 만들기( Building a Flexible UI ) (0) | 2015.03.27 |
프레그먼트 만들기 (Creating a Fragment) (0) | 2015.03.27 |
Fragment 로 Dynamic(동적) UI 만들기 (0) | 2015.03.27 |