探索Fragment(2)---数据交互

来源:互联网 发布:帝国时代2 mac版 编辑:程序博客网 时间:2024/04/29 18:45

Fragment使用时,要把数据传送给Activity 或者Fragment 那么就牵扯到  数据传递的过程了

1.控件的值获取跟传递

        首先得到某控件里面的值(如:editText等),那么只要在Activity/fragment得到控件的引用,那么就可以得到该控件的相关值,也空set控件的值

所以只要得到引用就可以了

        1.1.在Activity中得到Fragment中的控件:

代码:

<span style="font-size:18px;"><span style="white-space:pre"></span>setContentView(R.layout.activity_main);mFragmengManager = getFragmentManager();transaction = mFragmengManager.beginTransaction();fragment1 = new Fragment1();Bundle bundle = new Bundle();bundle.putString("name", "fragment1");fragment1.setArguments(bundle);transaction.replace(R.id.left, fragment1, "fragment1");transaction.addToBackStack("fragment1");transaction.commit();</span>
       在Oncreate完成以后才可以访问fragment的控件,否则为null,因为在onCreate时   fragment的的View还没有加载,所以要注意各自的生命周期:

       

<span style="font-size:18px;">         <span style="background-color: rgb(255, 255, 255);">   Button buttonFragment  = (Button) fragment1.getView().findViewById(R.id.fragment_button);buttonFragment.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "Toast fragment1", Toast.LENGTH_SHORT).show();}});</span></span>
         1.2Fragment中得到Activity中的控件:

              代码如下:

<span style="font-size:18px;">@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragmeng_f1, null);<span style="background-color: rgb(204, 204, 204);">button = (Button) getActivity().findViewById(R.id.activity_button);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getActivity(), "111111111", Toast.LENGTH_SHORT).show();}});</span>Bundle bundle = getArguments();if (null != bundle){String name = bundle.getString("name");button.setText("name :" + name);}return view;}</span>
     1.3 在fragment中得到另一个fragment的控件

             前面2中情况都是Activity中有fragment的引用, fragment可以getActivity()可以得到Activty的引用,而Fragment却没有方法得到另一个fragment的引用,要想得到另一个fragment得使用 FragmengManager.findFragmentByTag(tag)的方法了。

 代码:

        Activity中:

         

<span style="font-size:18px;">               setContentView(R.layout.activity_main);mFragmengManager = getFragmentManager();transaction = mFragmengManager.beginTransaction();fragment1 = new Fragment1();transaction.replace(R.id.left, fragment1, "fragment1");fragment2 = new Fragment2();transaction.replace(R.id.right, fragment2, "fragment2");transaction.commit();</span>
<span style="font-size:18px;">fragment2 中</span>
<span style="font-size:18px;"><strong>Fragment1 fragment1 = (Fragment1) mFragmengManager.findFragmentByTag("fragment1");</strong>if (null != fragment1){Button buttonFragment  = (Button) fragment1.getView().findViewById(R.id.fragment_button);buttonFragment.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getActivity(), "2222222222", Toast.LENGTH_SHORT).show();}});}</span>

记得tag要唯一,而且给控件引用时,要注意各自的生命周期

2. Activity  传送给Fragment

        2.1.使用setArguments的方法传递

         使用代码:

                mFragmengManager = getFragmentManager();transaction = mFragmengManager.beginTransaction();fragment1 = new Fragment1();Bundle bundle = new Bundle();bundle.putString("name", "fragment1");fragment1.setArguments(bundle);transaction.replace(R.id.left, fragment1, "fragment1");transaction.addToBackStack("fragment1");transaction.commit();
       在Fragmnet中
<span style="white-space: pre;"></span><span style="background-color: rgb(255, 255, 255);"><strong>Bundle bundle = getArguments();<span style="white-space: pre;"></span>if (null != bundle){<span style="white-space: pre;"></span>String name = bundle.getString("name");<span style="white-space: pre;"></span>button.setText("name :" + name);<span style="white-space: pre;"></span>}</strong></span>
       2.2  frgament可以直接通过getActivity() 访问Activity中的值,但是要强制转换(主动获取)

       如:String data = ((MainActivity)getActivity()).getdata();
Toast.makeText(getActivity(), "data = " + data, Toast.LENGTH_SHORT).show();

       2.3 使用接口回调,当Activity 的数据改变时通知fragment(自动接收)

       首先创建接口

      public interface CallBack {
   public void getResult(String data , int id);
      }

     fragmnet中实现接口:

public class Fragment1 extends MyBaseFragment  implements CallBack{

@Override
public void getResult(String data, int id) {
Toast.makeText(getActivity(), "data = " + data + "  id = " + id, Toast.LENGTH_SHORT).show();
}

}

       在Activity中注册(赋值)

       registerCallback(fragment1);

public void registerCallback(CallBack back){
this.mCallBack = back;
}
// 直接= 也可以 mCallBack  =  fragment1 

       最后是触发事件:可以是button点击 , 下载数据完成  等fragment关心的数据变化等都可以

       如:button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if (mCallBack != null){
mCallBack.getResult(data, 10001);
}
}
});


3. fragment 传送给Activity ,注意在fragment中setArguments这个方法行不通 ,调试时会报错,具体原因现在没有深究

         3.1Activity中有fragment的引用,直接访问就是了  (主动获取)

         3.2 接口回调的方式     (自动接收)


4. fragment 传递跟fragment   

      比第3点对一个操作,就是先得另一个fragment的引用,然后就可以直接访问,跟设置接口回调了

得到另一个fragmnent的引用在1.3中有写到


0 0
原创粉丝点击