从片段

时间:2015-07-13 09:52:42

标签: android android-fragments android-intent

我在网站搜索并且有与我类似的问题,但没有一个主题不是我的答案

看看这张照片:

enter image description here

所以很明显,我想通过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> 一起使用???

2 个答案:

答案 0 :(得分:3)

作者解释道。您的CrimeFragment方法onCreate()获取其托管活动(通过getActivity()),然后尝试从用于启动Intent的{​​{1}}获取UUID }。

这意味着现在包含Activity的任何活动都必须遵守此规则,即其意图应该(在其中)具有由名称CrimeFragment定义的额外内容。如果该活动不符合,您会在EXTRA_CRIME_ID的{​​{1}}中看到异常。

尝试在自己创建的新活动中使用此片段,看看会发生什么。

答案 1 :(得分:0)

在onActivityCreated()中检索

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        ....
    }
    else {
        UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID);
    }
}