2015-07-13 68 views
3

我搜索的網站,並有類似的問題,像我,但沒有主題的不是我的回答開始一個活動形式的片段

看看這張圖:

enter image description here

所以很清楚我想通過發送從CrimeListFragment在其intent

,我讀了這本書的intent +的extra開始CrimeActivity ndroid編程的作者說:

從一個片段開始一個活動的工作幾乎與從另一個活動開始一個活動相同。 您撥打Fragment.startActivity(意向)方法,它調用幕後相應的活動 方法

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的意圖。返回到CrimeFragment並添加額外的密鑰。然後,在 的onCreate(捆綁),從CrimeActivity的意圖獲取額外的,並用它來獲取犯罪

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不再是可重用的 building block,因爲它期望它始終由一個活動託管,該活動的意圖定義了一個名爲EXTRA_CRIME_ID的額外的 。

這對CrimeFragment的部分可能是一個合理的期望,但它 意味着CrimeFragment,如目前所寫,不能與 任何活動一起使用。

我的問題,問題是最後一句,爲什麼這個片段(CrimeFragment)不能僅僅用任何Activity使用???

+0

使用片段中的getActivity()來啓動新的活動。 –

回答

3

作者解釋它。您的CrimeFragment在其onCreate()方法中獲取其託管活動(通過getActivity()),然後嘗試從Intent獲取用於啓動Activity的UUID。

這意味着任何包含您的CrimeFragment的活動現在都必須遵守此規則,即其意圖應該有(在其中)額外定義的名稱EXTRA_CRIME_ID。如果該活動不符合,您會在CrimeFragmentonCreate()中看到異常。

嘗試在由您自己創建的新活動中查看會發生什麼。

+0

但你可以看到我們定義'EXTRA_CRIME_ID'在'CrimeFragment',不是其所在活動 –

+1

了''EXTRA_CRIME_ID'本身String'在片段中定義的,但你實際上是試圖從'活動獲得額外的具有該名稱的''Intent'。真正的問題是這樣的:如果包含'CrimeFragment'的'Activity'沒有額外的'Intent',你會看到崩潰。如果你替換'「JOHN SMITH」的'EXTRA_CRIME_ID''',你仍然需要'Activity'的'Intent'具有相同的額外值。 – takecare

+0

所以你的意思實際上有2傳遞'intent',第一個是從'CrimeListFragment'到'CrimActivity'和第二個是從'CrimeActivity'到'CrimeFragment' ??? –

0

檢索在onActivityCreated()

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