【问题标题】:How to pass data from activity to fragment如何将数据从活动传递到片段
【发布时间】:2012-11-29 07:20:49
【问题描述】:

我在将数据从活动传递到其中的片段时遇到了一些问题。我四处寻找,但没有找到适合我情况的答案。 我有 2 个名为 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);

有人告诉我在活动中使用setArguments,在片段中使用getArguments。但是在这种情况下,我如何在 Activity 中获取片段对象?我不能使用getFragmentManager().findFragmentById(),因为片段是通过编程方式添加的。

另外,我发现一些帖子说我可以在片段中使用getActivity() 来访问 Activity 容器中的数据,但对我来说它一直返回 null。有人有这方面的工作示例吗?

【问题讨论】:

  • getActivity()onAttach 方法中是否返回null
  • 尝试在 TaskitTabListener.onTabSelected() 中设置参数。
  • @svenkapudija 是的,它在onAttach 中变为空。
  • @faylon 谢谢。我会试试看。

标签: android android-fragments


【解决方案1】:

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

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

如果您希望片段从 Activity 中提取数据,请让您的 Activity 实现片段定义的接口。在片段的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();           
}

【讨论】:

  • 感谢您的回答,但您能解释一下“片段定义的接口”是什么意思吗?
  • 我更新了我的答案,因为我无法在 cmets 中编写漂亮的代码。看看你的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
相关资源
最近更新 更多