Fragmentシリーズ解析の3---FragmentとFragment、Activityの間で値を伝える
今日この文章ではFragmentに関する伝値についてお話しします.1、まずFragmentとFragmentの間でどのように価値があるかを話しましょう.
一、FragmentのホストActivityで変数を作成し、setメソッドとgetメソッドを設定し、Fragmentでこの値を取り出すことも、この値を変更することもできます.この方法は一般的に,伝達する値が比較的簡単であるか,あるいは内容が単一である場合に用いる.
二、
Fragmentの宿主Activityでは、どのFragmentが貼り付けられているかを判断し、値を渡す方法を定義します.
この方法では、添付するFragmentと送信するコンテンツbundleを選択することができます.上のコードはreplaceで代替され、TAGに基づいてロールバックスタックに参加するかどうかを判断することができます.これは私の以前のプロジェクトで書いたものです.もちろんhideとshowの方法を使っているのであれば、それではいけません.showとhideメソッドはこの過程に値を伝えていないからです.
三、コールバックを定義する私たちは1つのインタフェースを定義することができて、中に抽象的なコールバックの方法を書いて、すべてのFragmentを実現させます.この時、baseFragmentを定義して、ActivityにsetInterface()の方法を書いて、中のパラメータはインタフェースの対象(つまり私たちのFragment)で、それからFragmentを切り替える時、私たちはまずsetInterfaceの方法を呼び出して、私たちが交換するFragmentを伝えます.そして,このインタフェースの抽象メソッドを呼び出すと,抽象メソッドのパラメータは我々が伝達するパラメータであり,このとき,貼り付けられたFragmentはインタフェースを実現する抽象メソッドを呼び出し,パラメータを受信する目的を達成する.私の手の中のパソコンはとてもカードで、開発ツールが使えないので、簡単に大まかなコードを書きました.
2、FragmentとActivityの間で値を伝達する:
一、ActivityからFragmentへ値を伝達する:
これは簡単です.Fragmentの追加を始めたばかりの頃にbundleを使って値を伝えます.
それからFragmentのところにコードがあればいいです.
二、Fragmentは自分のActivityに値を伝えます.
1.Fragmentにコールバックインタフェース2を書く.このコールバックインタフェース3はactivityで実現され、FragmentにおけるonAttachメソッドではactivityで実現されたインスタンス化インタフェースオブジェクト4が得られ、インタフェースのオブジェクトで値が伝達される
MainActivity:
Fragment:
三、Fragmentは他のActivityに値を伝達する:
これはFragmentが呼び出したActivityが別のActivityに値を渡したことです
一、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);