Fragment 与 Activity之间传递数据

Fragment 与 Activity之间传递数据有两种方法,一种是使用setArgument,一种是使用接口回调。下面先学习第一种方法。

(1)使用setArgument方法:

为了便于理解,我在这里打个比喻:假如Activity是皇帝,它设立了三个部门(如三省六部),分别是Fragment1,Fragment2和Fragemnt3;

现在他现在要吩咐部门Fragment1去做一些事情,比如说:领兵攻打岛国!!好,它肯定不自己跑去告诉该部门的。

一般来说,会有个宰相或者太监总管来负责皇帝口谕是吧;这个太监总管就是FragmentManager。然后,当然,

太监总管也是不会亲自跑过去的,这时候有个名叫FragmentTransaction 的事务太监,总的来说,

它就负责三件事情:add(), remove(), replace(),按照皇帝的意思去增加一个部门,撤销一个部门,和替换掉一个部门。

现在这个事务太监有新任务了,就是增加一个部门,然后告诉它去攻打岛国。好。把内容“带兵攻打岛国”装到信封里

(信封就是Bundle)。注意到,这是密令,当然要做个记号什么的来标记一下,就是加上Tag,这里我们指定是“179521”。

最后绑在白鸽上发送出去(commit())。

\

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<pre name= "code" class = "java" > @Override
     public void onClick(View arg0) {
         if (arg0.getId()==R.id.send_data_btn) {
             LeftFragment fragment = new LeftFragment();
             Bundle bundle = new Bundle();
             bundle.putString( "order" , "带兵攻打岛国" );
             fragment.setArguments(bundle);
             FragmentManager fragmentManager = getFragmentManager();
             //开始Fragment事务
             FragmentTransaction fTransaction = fragmentManager.beginTransaction();
             //将Fragment添加到事务中,并指定一个TAG
             fTransaction.add(fragment, "179521" );
             //提交Fragment事务
             fTransaction.commit();
         }
         
     }</pre><br>
<br>
<pre class = "brush:java;" ></pre>
<p></p>
<p>
  </p>
<p>
上面那个比喻不是十分恰当,现在用正式的语言来说明下哈:</p>
<p>要是你熟悉Activity的生命周期,应该知道每一个应用都有一个独一无二的Task,Task里有个回退栈backstack,存储Activity的窗口实例对象;</p>
<p>由于Fragment也是有窗口实例对象的,因此它出现时也是要进入到回退栈的。</p>
<p>使用Fragment,Android为了让用户或者开发者来执行对Fragment的管理,比如说增加,移除和替换等。从Android3. 0 后有一个类,</p>
<p>FragmentManager专门用来管理Fragment,但是它不亲自执行具体动作,而是使用一个对象,片段事务,FragmentTransaction,</p>
<p>应该认识到的是 <strong>每个</strong><strong>FragmentTransaction</strong><strong>是一组同时执行的变化的集合。</strong><strong></strong>比如说同时添加 2 个Fragment,然后删除其中一个。</p>
<p>这都是同时执行的。用add(),remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。</p>
<p>
在commit()方法之前,你可以调用addToBackStack(),把这个transaction加入backstack中去,这个back stack是由activity</p>
<p>
管理的,当用户按返回键时,就会回到上一个fragment的状态。</p>
<p>
  </p>
<p>在Fragment接收数据:</p>
<p>得到FragmentManager,然后根据标签Tag和key取出对应的内容。</p>
<p></p>
<pre class = "brush:java;" ><pre name= "code" class = "java" > @Override
     public void onClick(View arg0) {
         if (arg0.getId()==R.id.get_data_btn) {
             String name = getFragmentManager().findFragmentByTag( "179521" ).getArguments().getString( "order" );
             Toast.makeText(getActivity(), "命令是" +name, Toast.LENGTH_SHORT).show();
         }
     }</pre><br>
<br>
<pre class = "brush:java;" ></pre>
结果如下:
<p><img src= "http://www.2cto.com/uploadfile/Collfiles/20140613/2014061309173087.jpg" alt= "n块ズ膻��0镩λk喎�" http:= "" www.2cto.com= "" soft "=" " target=" _blank " class=" keylink " style=" height: 560px; width: 314 .75409836065575px;">下载</p>
<p><br>
</p>
<p> </p>
<br>
<p><br>
</p>                        </pre>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值