点击CrimeListFragment的单项跳转到CrimeActivity
用Fragment.startActivity(Intent)或Fragment.startActivityForResult(intent,requestCode)
CrimeActivity.java
public static Intent newIntent(Context context, UUID crimeId)
{
Intent intent=new Intent(context,CrimeActivity.class);
intent.putExtra(CRIME_ID,crimeId);
return intent;
}
CrimeFragment需要知道crimeId
方法1:将crimeId作为intent的附加信息,再CrimeFragment中getActivity,再getIntent,再利用键值(注意这个键值是定义在CrimeActivity里的)获得附加信息
这样的方法虽然简单但破坏了fragment的封装型(被特定activity托管,并在其中使用了特定activity才有的键值),CrimeFragment不再是可复用的构建单元,不可用于其他activity
方法2:每个fragment实例都可附带一个Bundle对象
Bundle对象中的一个键值对即一个argument
要在fragment创建后,添加给activity之前,使用
Fragment.setArguments(Bundle)
CrimeFragment.java
public static CrimeFragment newInstance(UUID crimeId)
{
Bundle bundle=new Bundle();
bundle.putSerializable(CRIME_ID_BUNDLE,crimeId);
CrimeFragment fragment=new CrimeFragment();
fragment.setArguments(bundle);
return fragment;
}
CrimeActivity.java
@Override
protected Fragment createNewFragment()
{
//注意这里要强转一下
UUID crimeId=(UUID)getIntent().getSerializableExtra(CRIME_ID);
CrimeFragment fragment=CrimeFragment.newInstance(crimeId);
return fragm t;
}
startActivity后打开CrimeActivity,然后会在newCrimeFragment方法里调用CrimeFragment的newInstance方法,在这个方法中会处理好argument然后创建fragment
然后再CrimeFragment的onCreate方法中,通过getArguments得到Bundle然后获得附加信息