如果我在XML布局中声明一个片段,我该如何将它传递给一个Bundle?

我有一个活动,我已经用一个片段取代。 该活动采取了一个意图,有一些额外的信息,该活动应该显示什么数据。

现在我的活动只是一个包装片段,做了同样的工作,如果我用XML的XML标签声明片段如何获得该包到碎片?

如果我要使用FragmentTransaction将片段放到ViewGroup中,我将有机会在Fragment构造函数中传递此信息,但是我想知道在XML中定义片段的情况。

现在我的活动只是一个包装片段,做了同样的工作,如果我用XML的XML标签声明片段如何获得该包到碎片?

你不能。

不过,欢迎您在FragmentManager上调用findFragmentById()来检索扩展后的片段,然后调用片段上的某个方法将数据与它关联。 虽然显然这不能被setArguments() ,你的片段可以通过其他方式( onSaveInstanceState()setRetainInstance(true)等)来保存数据本身。

这不是一个封装的方式,但我最终从父活动“拉”的包:

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

另一种select是不在XML中声明片段。 我知道这不是你想要做的。 但是,您可以在视图中声明一个简单的布局,如下所示:

  <LinearLayout android:id="@+id/fragment_container" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" /> 

然后在你的Activity类中,用编程方式使用片段膨胀布局。 这样你可以使用parameter passing参数。

  FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); MyFragment fragment = MyFragment.newInstance(); Bundle args = new Bundle(); args.putInt(Global.INTENT_INT_ROLE, 1);' fragment.setArguments(args); fragmentTransaction.add(R.id.fragment_container, fragment, "MyActivity"); fragmentTransaction.commit(); 

这种方法并不像在xml中声明那样干净简单,但是我已经转向它,因为它使您能够更多地控制片段。

我看到的唯一解决scheme是不使用参数作为数据交换通道。 相反,让你的片段从其他地方获得必要的信息。 callback以获得正确的活动,请参阅临时存储器,Singleton对象等。

另一个可能有用的解决scheme是使用框架,允许不相关的对象通过Mediatordevise模式交换消息,如Otto 。