2012-11-29 55 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