如何从Activity传递数据到Fragment

8
我有些问题在 activity 和其内部的 fragment 之间传递数据。我搜索过但没有找到适合我的情况的答案。 我有两个 fragment 类,分别为 CurrentFragment.javaHistoryFragment.java。我把它们作为选项卡在一个 activity 中初始化。
    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);

我被告知在Activity中使用 setArguments,在Fragment中使用 getArguments。但在这种情况下,我如何在Activity中获取Fragment对象?由于Fragment是以编程方式添加的,所以无法使用 getFragmentManager().findFragmentById()
此外,我发现一些帖子说我可以在Fragment中使用 getActivity() 来访问Activity容器中的数据,但对我而言它一直返回null。有没有人有一个可行的例子呢?

getActivity()方法在onAttach方法中会返回null吗? - svenkapudija
尝试在TaskitTabListener.onTabSelected()中使用setArguments()。 - faylon
@svenkapudija 在 onAttach 中它返回 null。 - OckhamTheRazor
1个回答

8

[编辑] 我已经更新了我的答案,以更好地回应您的问题。

您还可以使用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"
    }
}

最后,在你的onAttach(Activity 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();           
}

谢谢你的回答,但是你能解释一下“由片段定义的接口”是什么意思吗? - OckhamTheRazor
我更新了我的回答,因为我无法在评论中编写漂亮的代码。请查看以获取您的答案。 - Sam Burba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接