Fragment&Fragment間の通信実装

4080 ワード

FragmentはActivityに関するコントロールです.Fragmentは常にActivityに埋め込まれている必要があります.Activityのライフサイクルはそれに直接影響します.例えばActivity Pausedの場合、FragmentもPausedです.しかし、Activity resumeの場合、Fragmentは追加、削除などの操作を独立して行うことができます.
FragmentのライフサイクルはActivityとよく似ています.次の図はGoogleドキュメントからコピーしたActivityとFragmentのライフサイクルの対比です.Fragmentを作成する場合、実装する必要があるonCreate()、onCreateView()、onPause()の3つの方法があります.
インターネット上ではPADのようなUI実装が多く見られますが、左側にリストがあり、右側に関連コンテンツが表示されます.ListFragmentを使用しています.単純な2つのFragmentがどのように通信しているのか知りたいだけです.私は最も簡単なDEMOを書きました.Activityで、中には2つのfragmentがあります.左fragmentのbuttonをクリックすると、右fragmentに単語が表示されます.とても汗をかいたのは、これは長い間考えていました.菜鳥ですね.最初からやりましょう.Fragment間では直接通信することはできず,Activityとの間接通信で実現しなければならない.
 
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class Book extends Activity implements OnArticleSelectedListener{


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.book);
    }


    @Override
    public void onArticleSelected(int id) {

        switch (id) {
            case R.id.button1 :
                showDetail();
                break;
                .....
            default:
                break;

        }
    }

    private void showDetail() {
        DetailFragment df = (DetailFragment)getFragmentManager().
                findFragmentById(R.id.detail_fragment);
        df.updateDetail();
    }

    public static class ArticleFragment extends Fragment {

        OnArticleSelectedListener mListener;

        // Container Activity must implement this interface
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            try {
                mListener = (OnArticleSelectedListener)activity;
            } catch (ClassCastException e) {

            }
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.article_view, container, false);
            v.findViewById(R.id.button1).setOnClickListener(
                    new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mListener.onArticleSelected(R.id.button1);
                }
            });
            return v;
        }
    }

    public static class DetailFragment extends Fragment {
        public View mView;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            mView = inflater.inflate(R.layout.detail_view, container, false);
            return mView;
        }

        public void updateDetail() {
            TextView textView;
            textView = (TextView)mView.findViewById(R.id.text_1);
            textView.setText("Emily");
        }
    }
}

 
public interface OnArticleSelectedListener {
    public void onArticleSelected(int id);
}

最終的にはこうなりました
 
 
 
Googleドキュメントの関連コンテンツ.
http://developer.android.com/guide/components/fragments.html
http://developer.android.com/training/basics/fragments/index.html