如果我在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 。