Android 复习6 fragment argument

这个传递真的是好难懂啊

首先我们先来看一看参与人员

1 firstactivity
2 seconactivity
3 firstfragment

过程是这样的:

secondactivity 向firstactivity 跳转 有个intent 。intent里面可以携带数据啊;

在intent.putExtra() 方法中我们传入一个键值对

获取方法有两种

1

键值都在 firstfragment中获取 但问题是intent是 firstactivity的,所以你想获取 你就必须和某个activity有强关联
在fragment中必须获取它所在activity的intent,这样就失去了fragment的封装性

 UUID crimeId =(UUID)getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID); 

2

既然是键值对 我们就可以想一下:
键的定义一定是属于fragment 的
而intent是属于activity的
而activity必须了解其下属fragment的(和封装性无关)

所以我们可以这样做

activity 获取其自身intent,并从fragment获取键,组合得到值;再把值传给fragment;

//fragment
public  static  String EXTRA_CRIME_ID="com.example.asus.criminalintent.crime_id";
  public static  CrimeFragment newInstance(UUID crimeid)
    {
        Bundle args = new Bundle();
        args.putSerializable(EXTRA_CRIME_ID,crimeid);
        CrimeFragment fragment = new CrimeFragment();
        fragment.setArguments(args);
        return  fragment;
    }

activity

    protected Fragment createFragment(){
    UUID crimeId =(UUID)getIntent().getSerializableExtra(CrimeFragment.EXTRA_CRIME_ID);
    return CrimeFragment.newInstance(crimeId);
    //return  new CrimeFragment();
}

简单比喻一下是这样:

第一种情况是:
儿子想买玩具,而玩具店呢,只能和妈妈进行交易,然后他就去找要妈妈去买玩具,并且声称得不到玩具,就不睡觉;

第二种情况是:

孤儿院有好些小孩 每个可能都有自己想要的玩具,他们就写在纸条上。如果孤儿院的员工看见某个小孩的愿望,并且想要将其实现,就去玩具店买玩具,并且将其送给小孩;

现在看完全看不懂上面在说啥

1

首先我们要懂得是fragment 和 activity的关系

activity就像是 一个父容器一样 fragment在其中

从fragment中启动 activity的方法

  Intent intent =new Intent(getActivity(), CrimePagerActivity.class);

fragment 也是通过Intent定位到目标activity的,不是也不能是目标fragment,跳转需要借助父容器才能跳转

2

跳转很容易做到,基本像是李四家的儿子要和张三家儿子说话,李四儿子先和李四说,李四告诉张三,张三告诉自己儿子;那传输数据是这样的吗?

     //CrimeListFragment
      Crime c =((CrimeAdapter)getListAdapter()).getItem(position);

        Intent intent =new Intent(getActivity(), CrimePagerActivity.class);
        intent.putExtra(CrimeFragment.EXTRA_CRIME_ID,c.getmId());
        startActivity(intent);

李四的儿子李小四要交给张三儿子张小三一封信,然后说张小三那里有解密的钥匙;CrimeFragment.EXTRA_CRIME_ID

//CrimeFragment
 public  static  String EXTRA_CRIME_ID="com.example.asus.criminalintent.crime_id";
    public  void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        UUID crimeId =(UUID)getArguments().getSerializable(EXTRA_CRIME_ID);
        mCrime= CrimeLab.get(getActivity()).getCrime(crimeId);
    }

张小三这里有秘钥;但是信在张三那里,所以他必须要和张三要,张三也必须有这么一封从李四那里过来的,且有这么一个秘钥记录的信;张三和张小三必须是父子关系,强关联;

那假如我告诉你说,父亲可以随便阅览儿子的秘钥,那会怎么样呢?

    UUID crimeId =(UUID)getIntent().getSerializableExtra(CrimeFragment.EXTRA_CRIME_ID);
    //return CrimeFragment.newInstance(crimeId);
    }

父亲拿过儿子的秘钥,解密了信件,放在了信箱

 public static  CrimeFragment newInstance(UUID crimeid)
    {
        Bundle args = new Bundle();
        args.putSerializable(EXTRA_CRIME_ID,crimeid);
        CrimeFragment fragment = new CrimeFragment();
        fragment.setArguments(args);
        return  fragment;
    }

信箱完成后,儿子就可以随意阅览了

就像是邮差可以送好多家的信一样;这样儿子和父的关系就弱化了;fragment就可以随便复用了;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值