我在网站搜索并且有与我类似的问题,但没有一个主题不是我的答案
看看这张照片:
所以很明显,我想通过CrimeActivity
中的intent
+ CrimeListFragment
extra
发送intent
来启动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);
}
我为Android编程阅读的那本书的作者说:
从片段开始活动与从另一个活动开始活动几乎相同。 您调用Fragment.startActivity(Intent)方法,该方法调用相应的Activity 幕后方法
CrimeListFragment.java:
intent
第二部分现在正在检索extra
及其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);
}
,并且作者对此进行了说明:
片段可以通过两种方式访问其活动意图中的数据:简单,直接的快捷方式和a 复杂,灵活的实施。首先,您将尝试快捷方式。然后你将实施 涉及片段参数的复杂而灵活的解决方案。
我的问题是第一种方式,即快捷方式
在快捷方式中,CrimeFragment将只使用getActivity()方法来访问 CrimeActivity的意图直接。返回CrimeFragment并添加额外的密钥。然后,在 onCreate(Bundle),从CrimeActivity的意图中检索额外内容并使用它来获取犯罪
CrimeFragment.java:
CrimeFragment
直接检索的缺点
让片段访问属于托管活动的intent会产生简单的代码。 但是,您需要对片段进行封装。 CrimeFragment不再是可重复使用的 构建块,因为它期望它始终由Intent定义的活动托管 额外命名为EXTRA_CRIME_ID。
这对CrimeFragment来说可能是一个合理的期望,但它 表示当前编写的CrimeFragment不能与之一起使用 只是任何活动。
我的问题和问题是最后一句,为什么这个片段(Activity
)不能与任何<video width="320" height="240" controls>
<source src="http://localhost:1935/vod/_definst_/mainVideo/smil:mainVideo.smil/manifest.f4m" type="video/mp4">
Your browser does not support the video tag.
</video>
一起使用???
答案 0 :(得分:3)
作者解释道。您的CrimeFragment
方法onCreate()
获取其托管活动(通过getActivity()
),然后尝试从用于启动Intent
的{{1}}获取UUID }。
这意味着现在包含Activity
的任何活动都必须遵守此规则,即其意图应该(在其中)具有由名称CrimeFragment
定义的额外内容。如果该活动不符合,您会在EXTRA_CRIME_ID
的{{1}}中看到异常。
尝试在自己创建的新活动中使用此片段,看看会发生什么。
答案 1 :(得分:0)
@Override
public void onActivityCreated(Bundle savedInstanceState) {
if (savedInstanceState != null) {
....
}
else {
UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID);
}
}