Fragmentシリーズ解析の3---FragmentとFragment、Activityの間で値を伝える

9031 ワード

今日この文章ではFragmentに関する伝値についてお話しします.1、まずFragmentとFragmentの間でどのように価値があるかを話しましょう.
一、FragmentのホストActivityで変数を作成し、setメソッドとgetメソッドを設定し、Fragmentでこの値を取り出すことも、この値を変更することもできます.この方法は一般的に,伝達する値が比較的簡単であるか,あるいは内容が単一である場合に用いる.
二、
Fragmentの宿主Activityでは、どのFragmentが貼り付けられているかを判断し、値を渡す方法を定義します.
        public void switchConent(Fragment fragment, String title,
            String fragmentFlag, Bundle bundle) {
        //     bundle
        fragment.setArguments(bundle);
        mContent = fragment;
        if (!"".equals(fragmentFlag{
        getSupportFragmentManager().beginTransaction().replace(R.id.content_frame,fragment,fragmentFlag).addToBackStack(fragmentFlag).commit();
        } else {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.content_frame, fragment).commit();
        }
    }

この方法では、添付するFragmentと送信するコンテンツbundleを選択することができます.上のコードはreplaceで代替され、TAGに基づいてロールバックスタックに参加するかどうかを判断することができます.これは私の以前のプロジェクトで書いたものです.もちろんhideとshowの方法を使っているのであれば、それではいけません.showとhideメソッドはこの過程に値を伝えていないからです.
三、コールバックを定義する私たちは1つのインタフェースを定義することができて、中に抽象的なコールバックの方法を書いて、すべてのFragmentを実現させます.この時、baseFragmentを定義して、ActivityにsetInterface()の方法を書いて、中のパラメータはインタフェースの対象(つまり私たちのFragment)で、それからFragmentを切り替える時、私たちはまずsetInterfaceの方法を呼び出して、私たちが交換するFragmentを伝えます.そして,このインタフェースの抽象メソッドを呼び出すと,抽象メソッドのパラメータは我々が伝達するパラメータであり,このとき,貼り付けられたFragmentはインタフェースを実現する抽象メソッドを呼び出し,パラメータを受信する目的を達成する.私の手の中のパソコンはとてもカードで、開発ツールが使えないので、簡単に大まかなコードを書きました.
interface MyCallBack{
void callBack(String result);
}

public class MainActivity
{
    private MyCallBack myCallBack;
    public void setMycallBack(MyCallBack myCallBack){
        this.myCallBack=myCallBack;
    }
    public void setFragment(String result){
    //  Fragment   ,   replace,add    show,hide
    myCallBack.callBack(String result);
    }
}

public class MyFragmentA implements MyCallBack{


    public void callBack(String result){
    //        ,       
    }

    public void switchFragment(String result){
        //  Fragment,  Fragment  
    getActivity().setFragment(String result)
    }
}

2、FragmentとActivityの間で値を伝達する:
一、ActivityからFragmentへ値を伝達する:
これは簡単です.Fragmentの追加を始めたばかりの頃にbundleを使って値を伝えます.
fragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame,fragment,fragmentFlag).addToBackStack(fragmentFlag).commit();

それからFragmentのところにコードがあればいいです.
  Bundle bundle = getArguments();// activity    Bundle  

二、Fragmentは自分のActivityに値を伝えます.
1.Fragmentにコールバックインタフェース2を書く.このコールバックインタフェース3はactivityで実現され、FragmentにおけるonAttachメソッドではactivityで実現されたインスタンス化インタフェースオブジェクト4が得られ、インタフェースのオブジェクトで値が伝達される
MainActivity:
public class MainActivity extends Activity implements CallBackValue{

    private TextView tv1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv1 = (TextView) findViewById(R.id.tv1);

        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();

        transaction.add(R.id.contents, new Fragmen1());
        transaction.commit();

    }
    //               
    @Override
    public void SendMessageValue(String strValue) {
        // TODO Auto-generated method stub
        tv1.setText(strValue);
    }
}

Fragment:
public class Fragmen1 extends Fragment{
    private Button btn1;
    private EditText et1;
    CallBackValue callBackValue;

    /**
     * fragment activity              
     */
    @Override
    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);
        //  fragment activity                   
        callBackValue =(CallBackValue) getActivity();
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment_layout1, container, false);
         btn1 = (Button) view.findViewById(R.id.btn1);
         et1 = (EditText) view.findViewById(R.id.et1);
         btn1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String strValue = et1.getText().toString().trim();
                callBackValue.SendMessageValue(strValue);

            }
        });

        return view;
    }
    //        
    public interface CallBackValue{
        public void SendMessageValue(String strValue);
    }
}

三、Fragmentは他のActivityに値を伝達する:
これはFragmentが呼び出したActivityが別のActivityに値を渡したことです
context = getActivity().getApplicationContext(); 
Intent intent = new Intent(context,   .class);