我在网站上搜索了类似于我的问题,但是没有一个能够回答我的问题。
看一下这张图片:
所以很明显我想通过从CrimeListFragment
发送一个带有extra
的intent
来启动CrimeActivity
我读的关于android编程的书籍作者说:
从片段开始一个活动几乎与从另一个活动开始一个活动一样。 你调用 Fragment.startActivity(Intent) 方法,该方法在幕后调用相应的 Activity 方法
CrimeListFragment.java:
public void onListItemClick(ListView l, View v, int position, long id) {
// Get the Crime from the adapter
Crime c = ((CrimeAdapter)getListAdapter()).getItem(position);
// Start CrimeActivity
Intent i = new Intent(getActivity(), CrimeActivity.class);
i.putExtra(CrimeFragment.EXTRA_CRIME_ID, c.getId());
startActivity(i);
}
现在的第二部分是检索 intent
及其 extra
,关于这一点作者说:
一个片段可以通过两种方式访问其活动中的数据:一种简单、直接的方式和一种复杂、灵活的方式。首先,您将尝试使用快捷方式。然后,您将实现涉及片段参数的复杂而灵活的解决方案。
我的问题是关于第一种方式,也就是快捷方式。
在快捷方式中,CrimeFragment 将简单地使用 getActivity() 方法直接访问 CrimeActivity 的 intent。返回到 CrimeFragment 并添加 extra 的键。然后,在 onCreate(Bundle) 中,从 CrimeActivity 的 intent 中检索 extra,并使用它来获取 Crime。
CrimeFragment.java :
public class CrimeFragment extends Fragment {
public static final String EXTRA_CRIME_ID =
"com.bignerdranch.android.criminalintent.crime_id";
private Crime mCrime;
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCrime = new Crime();
UUID crimeId = (UUID)getActivity().getIntent()
.getSerializableExtra(EXTRA_CRIME_ID);
mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
}
直接检索的缺点
使片段访问属于托管活动的意图可确保代码简单易懂。 但是,这会导致你失去了片段的封装性。CrimeFragment不再是可重用的构建块, 因为它预期总是由一个其Intent定义了名为 EXTRA_CRIME_ID 的额外信息的活动托管。
这可能是CrimeFragment的合理期望,但这意味着作为当前编写方式, CrimeFragment 无法与任何活动一起使用。
我的问题和问题在于最后一句话,为什么这个Fragment(CrimeFragment
)不能只与任何Activity
一起使用?