从活动中设置片段的参数

Posted

技术标签:

【中文标题】从活动中设置片段的参数【英文标题】:Set arguments of fragment from activity 【发布时间】:2013-08-10 01:19:33 【问题描述】:

我想将我的活动中的参数传递给嵌入到活动中的片段。片段静态嵌入在 xml 布局中。 我尝试这样调用 setArgument():

setContentView(R.layout.detail_activity);
DetailFragment detailFragment = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment);
detailFragment.setArguments(getIntent().getExtras());

但已经太晚了,因为 setArguments 必须在片段创建后立即调用。我唯一看到的是 getArguments() 并更改了捆绑包。有更好的方法吗?

【问题讨论】:

建议你参考***.com/a/12739968/1554935 不,他们以编程方式创建片段,而我的片段是 xml 的一部分。 我也有同样的问题。我见过的所有示例都将片段添加到活动的容器中。 你找到解决办法了吗 这可能会帮助你***.com/a/21747806/1808468 【参考方案1】:

AFAIK,当您将片段嵌入 XML 时,您不能像那样使用 setArguments()。如果它很关键,你最好动态添加片段。但是,如果您真的希望通过 XML 嵌入片段,则可以通过不同的方式传递该数据。

    让 Activity 实现片段的事件监听器。然后让片段在创建时或需要时从 Activity 请求所需的参数。 Communication with Fragment 创建可以与片段一起嵌入到 xml 中的自定义属性。然后在片段的膨胀过程中,解析自定义属性以获取它们的数据。 Custom fragment attributes 在片段中创建公共设置器并让活动直接使用它们。如果在 Fragment 的 onCreate() 方法之前设置它们很重要,那么从 Activity 的 onAttachFragment() 方法中进行设置。

【讨论】:

onAttachFragment() 是一个很好的提示。谢谢! 这是一个很好的答案,为什么不被接受?虽然它应该补充说这些都是变通方法,除非片段是静态的并且是独立的,否则推荐的方法是将片段附加到由 Activity#setContentView 定义的容器视图 onAttachFragment() 未被调用。我错过了什么吗? Nvm,我使用的是onAttachFragment(android.app.Fragment fragment) 调用而不是支持库调用。【参考方案2】:

这里有两种选择

    如果您只需要活动意图中的信息,那么将意图中的信息放入片段参数只会增加一个不需要的步骤。您可能会很好地保持简单并从您的片段调用中进行

    Bundle data = getActivity().getIntent().getExtras();
    

    如果您需要添加不在活动意图中的信息,则在您的片段中创建一个无参数构造函数,例如:

    public DetailFragment() 
        this.setArguments(new Bundle());
    
    

然后在您的活动中,您可以使用以下代码添加所需的任何参数:

    DetailFragment frg = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment);
    frg.getArguments().putBundle("key", data);

这里的重点是使用现有的 bundle 对象,而不是在片段附加到活动后尝试调用 setArguments()。

【讨论】:

putBundle 位于 setContentView 之后,对吧?所以片段是在我们添加包之前创建的。我们需要刷新片段吗?谢谢。【参考方案3】:

另一种向 Fragment 传递数据的方式如下:

//In DetailFragment (for Instance) define a public static method to get the instance of the fragment

public static final DetailFragment getInstance(Bundle data) 
    DetailFragment fragment = new DetailFragment();
    fragment.setArguments(data);
    return fragment;

当从 Activity 内部附加 DetailFragment 时

Bundle data = new Bundle();
//Add data to this bundle and pass it in getInstance() of DetailFragment
fragmentTransaction.replace(R.id.frament_layout, DetailFragment.getInstance(data));

【讨论】:

以上是关于从活动中设置片段的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在选项卡式活动中设置片段从右到左开始

在android活动中设置片段的形状和透明度

如何以编程方式从片段内部设置ViewPager选项卡?

通过 id 从片段获取编辑文本到其托管活动

如何为代码中设置的参数设置布局单位?

手动设置片段的屏幕方向