2012-07-09 19 views
82

隨着活動,我曾經這樣做:Where/HowIn getIntent()。getExtras()在Android的片段?

在活動1:

Intent i = new Intent(getApplicationContext(), MyFragmentActivity.class); 
       i.putExtra("name", items.get(arg2)); 
       i.putExtra("category", Category); 
       startActivity(i); 

在活動2:

Item = getIntent().getExtras().getString("name"); 

你如何做到這一點使用片段?我也在使用兼容性庫v4。

它是否在FragmentActivity?還是實際的片段? 它進入哪個方法?的onCreate? onCreateView?另一個?

我能看到示例代碼嗎?

編輯:這是值得注意的我試圖保持活動1作爲一個活動(或實際ListActivity,我通過listitem意圖單擊時),然後傳遞給一組標籤片段(通過片段活動),我需要兩個選項卡才能獲得額外功能。 (我希望這是可能的嗎?)

+2

它可能是重複的,但人們似乎更喜歡這個問題。我只是說。 – KickingLettuce 2015-07-01 17:19:03

回答

97

我傾向於做什麼,我相信這是谷歌旨在讓開發者做太多,是仍然可以從Intent臨時演員在Activity,然後傳遞任何額外的數據通過用參數實例化它們來分割。

在Android開發博客上實際上有an example,它說明了這個概念,你也會在幾個API演示中看到這一點。雖然這個特定的例子是針對API 3.0+片段給出的,但當使用支持庫中的FragmentActivityFragment時,同樣的流程適用。

你先檢索意圖演員像往常一樣在你的活動,並把它們作爲參數傳遞給片段:

public static class DetailsActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // (omitted some other stuff) 

     if (savedInstanceState == null) { 
      // During initial setup, plug in the details fragment. 
      DetailsFragment details = new DetailsFragment(); 
      details.setArguments(getIntent().getExtras()); 
      getSupportFragmentManager().beginTransaction().add(
        android.R.id.content, details).commit(); 
     } 
    } 
} 

在直接調用構造函數代替,它可能更容易使用,插一個靜態方法爲你的片段的參數。這種方法在examples given by Google中通常被稱爲newInstance。有實際上是一個DetailsFragment方法newInstance,所以我不能確定它爲什麼沒有在上面的代碼片段中使用...

不管怎麼說,在創建片段設置爲參數中的所有演員,將可通過調用。由於這返回Bundle,其用法與Activity中的臨時演員相似。

public static class DetailsFragment extends Fragment { 
    /** 
    * Create a new instance of DetailsFragment, initialized to 
    * show the text at 'index'. 
    */ 
    public static DetailsFragment newInstance(int index) { 
     DetailsFragment f = new DetailsFragment(); 

     // Supply index input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("index", index); 
     f.setArguments(args); 

     return f; 
    } 

    public int getShownIndex() { 
     return getArguments().getInt("index", 0); 
    } 

    // (other stuff omitted) 

} 
+0

嘿,謝謝,我會試試這個標記爲正確的,但它對我來說很好!同時,如果我想根據您的答案來獲取意圖的價值並在textView上設置該文本,是否會像這樣? 'tv.setText(getShownIndex())'?我實際上抓住了兩個不同的額外功能---在我的例子中是「名稱」和「類別」 - 這是如何改變上面的代碼的? – KickingLettuce 2012-07-09 14:23:44

+0

只需要添加許多參數到'newInstance(...)',因爲您需要傳遞額外信息,並將每個參數放入參數'Bundle'中。就個人而言,我通常會在片段的一個「onCreate ...()」方法中檢索所有參數,並將它們分配給變量。這樣你就可以在實現中的任何地方使用它們。 – 2012-07-09 19:20:09

+0

關於在onCreate中檢索,語法是什麼?通常我使用'Item = getIntent()。getExtras()。getString(「name」);'它現在如何改變? (我認爲這回答了最後剩下的問題) – KickingLettuce 2012-07-09 21:49:14

150

你仍然可以使用

String Item = getIntent().getExtras().getString("name"); 

fragment,你只需要調用getActivity()第一:

String Item = getActivity().getIntent().getExtras().getString("name"); 

這樣可以節省你不必編寫一些代碼。

+0

這節省了大量的代碼編寫!好一個:) – 2013-04-29 18:49:17

+3

太棒了!這確實節省了我寫了很多代碼;) – 2013-09-01 19:08:25

+2

檢索意圖數據的簡單而優雅的方式。 – zeeshan 2013-11-13 05:45:10