05 使用fragment argument

附加extra信息

在MainActivity类中新增newIntent方法:

public static final String EXTRA_CRIME_ID = "com.example.criminalintent.crime_id";

public static Intent newIntent(Context packageContext, UUID crimeId) {
    Intent intent = new Intent(packageContext, MainActivity.class);
    intent.putExtra(EXTRA_CRIME_ID, crimeId);

    return intent;
}

更新CrimeHolder类,使用newIntent方法传递crime实例:

@Override
public void onClick(View v) {
    Intent intent = MainActivity.newIntent(getActivity(), mCrime.getId());
    startActivity(intent);
}

获取extra信息

直接获取MainActivity的intent

在CrimeFragment类中使用 getActivity() 方法获取 CrimeActivity的intent。返回至 CrimeFragment 类,得到 CrimeActivity 的intent内的extra信息后,再用它获取Crime 对象:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    UUID crimeId = (UUID) getActivity().getIntent().getSerializableExtra(MainActivity.EXTRA_CRIME_ID);
    mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
}

然后在CrimeFragment类中更新onCreateView(LayoutInflater, ViewGroup, Bundle)方法,显示Crime对象的标题和解决状态。

fragment argument

每个fragment实例都可附带一个Bundle对象。创建一个Bundle对象,然后使用Bundle.put方法将argument添加到bundle中。

添加名为 newInstance() 的静态方法给 Fragment 类。使用该方法,完成fragment实例及bundle对象的创建,然后将argument放入bundle中,最后再附加给fragment。

private static final String ARG_CRIME_ID = "crime_id";
public static CrimeFragment newInstance(UUID crimeId) {
    Bundle args = new Bundle();
    args.putSerializable(ARG_CRIME_ID, crimeId);

    CrimeFragment fragment = new CrimeFragment();
    fragment.setArguments(args);
    return fragment;
}

现在,需创建 CrimeFragment 时, CrimeActivity 应调用CrimeFragment.newInstance(UUID)
方法,并传入从它的extra中获取的 UUID 参数值。回到 CrimeActivity类中,在 createFragment()方法里,从 CrimeActivity 的intent中获取extra数据,并传入CrimeFragment.newInstance(UUID)方法。

private static final String EXTRA_CRIME_ID = "com.example.criminalintent.crime_id";

@Override
protected Fragment createFragment() {
    //return new CrimeFragment();
    UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID);
    return CrimeFragment.newInstance(crimeId);
}
获取argument
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //mCrime = new Crime();
    UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
    mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
}

刷新显示列表项

在 CrimeListFragment 中,覆盖 onResume() 方法,触发调用 updateUI() 方法刷新显示列表项,如代码清单10-9所示。如果已配置好 CrimeAdapter,就调用 otifyDataSetChanged() 方法来修改 updateUI() 方法。

@Override
public void onResume() {
    super.onResume();

    updateUI();
}

//为RecyclerView设置Adapter
private void updateUI() {

    CrimeLab crimeLab = CrimeLab.get(getActivity());
    List<Crime> crimes = crimeLab.getCrimes();

    if (mAdapter == null) {
        mAdapter = new CrimeAdapter(crimes);
        mCrimeRecyclerView.setAdapter(mAdapter);
    }
    else {
        mAdapter.notifyDataSetChanged();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值