关于fragment的传值

前言:

fragment是在Android3.0定义出来的,它和Activity的区别其实在于fragment能够更好的支持界面模块化,例如可以在同一个Activity界面上显示两块fragment,点击左边fragment中的控件去改变右边fragment中的控件。

相对的来说,fragment算是一个抽象的Activity。

fragment可以实现标签切换,当然,要做标签切换效果用Viewpager最好。

正题

fragment传值有两种情况:

1、同一个Activity中不同容器(container)的两个fragment值传递。

2、同一个容器(container)的两个fragment值传递。

传值的方式有很多,但是基于项目中代码应该具有更大的耦合性,因此建议采用广播方式传值。

先以情况2为例:

同一容器中fragment1中定义两个Button(bt1、bt2),fragment2中定义一个TextView(tv),点击不同的Button来改变TextView的值。

fragment1代码:

 1 public class Fragment1 extends Fragment {
 2 
 3     private Button bt1;
 4     private Button bt2;
 5     
 6     
 7     @Override
 8     public View onCreateView(LayoutInflater inflater, ViewGroup container,
 9             Bundle savedInstanceState) {
10         View view = inflater.inflate(R.layout.fragment1, null);
11         bt1 = (Button) view.findViewById(R.id.bt1);
12         bt2 = (Button) view.findViewById(R.id.bt2);
13 
14         bt1.setOnClickListener(new MyClickListener());
15         bt2.setOnClickListener(new MyClickListener());
16         
17         
18         return view;
19     }
20     
21     private class MyClickListener implements OnClickListener{
22 
23         @Override
24         public void onClick(View v) {
25             
26             
27             switch(v.getId()){
28             case R.id.bt1:
29                 Intent intent = new Intent();
30                 intent.setAction("123");
31                 LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
32                 break;
33                 
34             case R.id.bt2:
35                 Intent intent2 = new Intent();
36                 intent2.setAction("321");
37                 LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent2);
38                 break;
39             }
40             
41         }
42         
43     }
44     
45 
46 }
View Code

 fragment2代码:

 1 public class Fragment2 extends Fragment {
 2 
 3     private TextView tv;
 4     
 5     @Override
 6     public View onCreateView(LayoutInflater inflater, ViewGroup container,
 7             Bundle savedInstanceState) {
 8         View view = inflater.inflate(R.layout.fragment2, null);
 9         tv = (TextView)view.findViewById(R.id.tv);
10 
11         return view;
12     }
13     
14     
15 
16 
17 
18 @Override
19     public void onActivityCreated(Bundle savedInstanceState) {
20     LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(getActivity());
21     IntentFilter filter = new IntentFilter();
22     filter.addAction("123");
23     filter.addAction("321");
24     MyBroadcastReciver myBroadcastReciver = new MyBroadcastReciver();
25     localBroadcastManager.registerReceiver(myBroadcastReciver, filter);
26     super.onActivityCreated(savedInstanceState);
27     }
28 
29 
30 
31     private class MyBroadcastReciver extends BroadcastReceiver{
32 
33         @Override
34         public void onReceive(Context context, Intent intent) {
35             String s = intent.getAction();
36             if(s.equals("123")){
37                 tv.setText("111111111");
38             }else if(s.equals("321")){
39                 tv.setText("222222222");
40             }
41             
42         }
43         
44     }
45     
46     @Override
47     public void onDestroy() {
48         
49         super.onDestroy();
50     }
51 
52 }
View Code

此方法中利用不同的Button产生不同的广播,然后再在接收端来String s = intent.getAction(); 再对s的值进行判断做对应处理。

对于使用广播,不仅可以用不同的setAction()来区分不同的事件,也可以用intent.putExtra("KEY", "value"); 来区分不同的事件。

 

posted @ 2015-11-20 18:01  菜鸟学C  阅读(998)  评论(0编辑  收藏  举报