2012-11-29 59 views
8

我有一些問題,將數據從活動傳遞到片段。我四處搜尋,但沒有找到適合我情況的答案。 我有2個片段類,名爲CurrentFragment.javaHistoryFragment.java。我將它們初始化爲活動中的選項卡。如何將數據從活動傳遞到片段

Tab tab = actionBar.newTab() 
      .setText(R.string.tab_current) 
      .setTabListener(new TaskitTabListener<CurrentFragment>(
        this, "current", CurrentFragment.class)); 
    actionBar.addTab(tab); 

    tab = actionBar.newTab() 
      .setText(R.string.tab_history) 
      .setTabListener(new TaskitTabListener<HistoryFragment>(
        this, "history", HistoryFragment.class)); 
    actionBar.addTab(tab); 

有人告訴我,在片段用在活動setArgumentsgetArguments。但在這種情況下,我如何在活動中獲得片段對象?由於片段是以編程方式添加的,因此我無法使用getFragmentManager().findFragmentById()

此外,我發現一些帖子說我可能在片段中使用getActivity()來訪問Activity容器中的數據,但對於我來說它會一直返回null。有沒有人有這樣的工作例子?

+0

是否'getActivity()''返回在[onAttach] null'(http://developer.android.com/reference/android/support/v4/app/Fragment.html#onAttach%28android。 app.Activity%29)方法? – svenkapudija

+0

嘗試在TaskitTabListener.onTabSelected()中設置參數。 – faylon

+0

@svenkapudija是的,它在'onAttach'上返回null。 – OckhamTheRazor

回答

7

[編輯]我更新了我的答案,以更好地回答你的問題。

您還可以通過標記getFragmentManager().findFragmentByTag("tag")檢索片段。但要小心,如果該選項卡尚未被查看,片段將不存在。

CurrentFragment curFrag = (CurrentFragment) 
    getFragmentManager().findFragmentByTag("current"); 
if(curFrag == null) { 
    // The user hasn't viewed this tab yet 
} else { 
    // Here's your data is a custom function you wrote to receive data as a fragment 
    curFrag.heresYourData(data) 
} 

如果您希望片段從活動中提取數據,您的活動將實施由片段定義的接口。在片段的onAttach(Activity activity)生命週期函數中,您可以訪問創建片段的活動,以便您可以將該活動作爲您定義的接口進行轉換並進行函數調用。要做到這一點把界面在你的片段像這樣(您也可以使接口它自己的文件,如果你想分享許多的片段中,相同的接口):

public interface DataPullingInterface { 
    public String getData(); 
} 

然後實現在您的活動,如接口這樣的:

public class MyActivity extends Activity implements DataPullingInterface { 
    // Your activity code here 
    public String getData() { 
     return "This is my data" 
    } 
} 

終於在CurrentFragment您onAttach(Activity activity)法鑄造您作爲創建這樣你就可以調用這些函數接口的活動。

private DataPullingInterface mHostInterface; 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    if(D) Log.d(TAG, "onAttach"); 
    try { 
     mHostInterface = (DataPullingInterface) activity; 
    } catch(ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement DataPullingInterface"); 
    } 
    String myData = mHostInterface.getData();   
} 
+0

感謝您的回答,但您能解釋它是什麼意思「由片段定義的接口」? – OckhamTheRazor

+0

我更新了我的答案,因爲我無法在評論中做出漂亮的代碼。看看你的答案。 –

+0

太棒了!這對我行得通。謝謝你的幫助。 – OckhamTheRazor