附加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();
}
}