[5] Fragment 로 다이나믹 UI 만들기 [3] 다른 Fragment 들과 통신

THIS LESSON TEACHES YOU TO

  1. Define an Interface
  2. Implement the Interface
  3. Deliver a Message to a Fragment

YOU SHOULD ALSO READ

TRY IT OUT

Download the sample

FragmentBasics.zip

 

In order to reuse the Fragment UI components, you should build each as a completely self-contained, modular component that defines its own layout and behavior. Once you have defined these reusable Fragments, you can associate them with an Activity and connect them with the application logic to realize the overall composite UI.

Fragment UI 컴포넌트를 재사용하기 위해서, 각각 완벽한 자신을 포함한 모듈의 컴포넌트를 빌드해야 합니다. 이 것은 자신의 레이아웃과 행동을 정의하지요. 일단 우리가 Fragments의 재사용을 정의하고 나면, 이 것들을 엮을 수  있습니다. 액티비티와. 그리고 그들과 연결할 수 있습니다. 어플리케이션 로직을. 구현하기 위해서 전반적인 조합적인 UI를 말이지요.

Often you will want one Fragment to communicate with another, for example to change the content based on a user event. All Fragment-to-Fragment communication is done through the associated Activity. Two Fragments should never communicate directly.

종종 우리는 Fragment 가 서로 통신하길 바라지요. 예를 들어 내용물을 사용자 이벤트에 의해서 바꾼다던지 말이죠. 모든 Fragment 간 통신은 연관된 액티비티를 통해서 됩니다. 두 Fragment 는 직접 연결됩니다.

인터페이스 정의하기 – Define an Interface


To allow a Fragment to communicate up to its Activity, you can define an interface in the Fragment class and implement it within the Activity. The Fragment captures the interface implementation during its onAttach() lifecycle method and can then call the Interface methods in order to communicate with the Activity.

자신의 액티비티까지 Fragment 가 통신하기 위해서, Fragment 클래스에 인터페이스를 정의해야 합니다. 그리고 액티비티에서 구현해야 합니다. Fragment 는 인터페이스를 onAttach() 라이프 사이클 메서드 동안에 구현을 잡고 있습니다. 그리고 나서 인터페이스 메서드를 호출할 수 있습니다 액티비티와 통신하기 위해서

Here is an example of Fragment to Activity communication:

Fragment – 액티비티 통신에 대한 예제입니다.

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");
        }
    }
    
    ...
}

Now the fragment can deliver messages to the activity by calling the onArticleSelected() method (or other methods in the interface) using the mCallback instance of the OnHeadlineSelectedListener interface.

이제 fragment 는 메시지를 전달할 수 있습니다. onArticleSelected() 메서드를 호출해서 액티비티에게 메시지를 전달할 수 있습니다. (또는 인터페이스 내의 다른 메서드) onHeadlineSelectedListener 인터페이스의 mCallBack 인스턴스를 사용해서 합니다.

For example, the following method in the fragment is called when the user clicks on a list item. The fragment uses the callback interface to deliver the event to the parent activity.

에를 들어, 다음 메서드는 호출됩니다. 사용자가 리스트 아이템을 클릭할 때. fragment 는 사용합니다 콜백 인터페이스를. 이벤트를 부모 액티비티에게 전달하기 위해서

    @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


In order to receive event callbacks from the fragment, the activity that hosts it must implement the interface defined in the fragment class.

For example, the following activity implements the interface from the above example.

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


The host activity can deliver messages to a fragment by capturing the Fragment instance withfindFragmentById(), then directly call the fragment’s public methods.

호스트 액티비티가 메시지를 fragment 에게 Fragment 인스턴스를 findFragmentById() 와 함께 캡쳐함으로써 전달할 수 있습니다. 그리고 직접적으로 fragment의 public 메서드를 호출합니다.

For instance, imagine that the activity shown above may contain another fragment that’s used to display the item specified by the data returned in the above callback method. In this case, the activity can pass the information received in the callback method to the other fragment that will display the item:

예를 들어, 상상해 보세요. 액티비티 (보여지는 ( 위에))는 가지고 있을 수 있습니다. 다른 fragment 를. 이 것은 보여지는데 사용됩니다. 아이템을. 명시된. 데이터로. 위의 콜백 메서드에서 반환된. 이러한 경우, 액티비티는 콜백에서 받은 그 정보를 다른 fragment 로 전달해 줄 수 있습니다. 아이템을 보여줄 fragment 지요

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();
        }
    }
}
Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중