我有一个活动名为A.活动有1个框架布局,其中使用了碎片。我有两个片段,Fragment1和Fragment2。启动“活动”时,片段1将填充“帧布局”。
Fragment1还包含一个按钮,单击该按钮会在同一帧布局中将其替换为Fragment2。我的问题是,当我点击Fragment1中的Button时,我应该实现该代码以便
A)活动A通过使用某种类型的布尔值的接口通知片段中的onClick,然后继续用Fragment2替换它。
OR
B)在Fragment1本身中实现用Fragment2替换Fragment1的代码例如:
private FragmentTransaction ft;
private Button registerButton, resetButton;
private Fragment fragment;
public LoginFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_login, container, false);
registerButton = (Button)view.findViewById(R.id.register_button);
resetButton = (Button) view.findViewById(R.id.reset_button);
registerButton.setOnClickListener(this);
resetButton.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.register_button: {
fragment = new RegisterFragment();
ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack(null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
break;
}
}
}
有人可以解释为什么一个在另一个上面吗?非常感谢!
答案 0 :(得分:2)
通常,我所做的是使用某种类型的接口,它存在于被替换的片段中(在本例中为Fragment 1)。然后,您的父活动将实现此接口,从而在作为该特定片段的父级的活动之间建立合同。
当您按下按钮(或任何发生信号替换的事件)时,您将获取将其投射到该界面的活动,并调用特定方法。
e.g。片段内的信令事件
( (MyFragmentListener) getActivity()).onActionHappens();
其中MyFragmentListener是Fragment的内部类,而onActionHappens()是发送信号的方法。这有效地在您的片段和托管片段的任何Activity之间创建了一个契约。当您的操作发生时,您可以让活动知道,然后活动会覆盖适当的方法来处理事件。
还有其他方法可以做到这一点,但最简单的方法就是如何做到这一点。
为什么不选择B
选项B在片段之间创建紧密耦合,您不一定需要它们。在实践中,您希望耦合位于片段之间,以及它作为活动的主机(或父)。此外,可能有许多活动使用该片段,因此您只需调用getActivity()就可以抽象出有关使用它的特定活动的详细信息。在这种情况下,耦合片段和活动是可以接受的,因为当然两者无论如何都是耦合的。我们知道这是因为片段不能没有相关的活动,所以可以利用紧密耦合。
<强>摘要强>
选择选项A.这是最干净的路线,并且避免假设您必须在选项B中执行实施细节。
它也是您没有任何外部库或详细信息的基本解决方案。如果您想要更高级的解决方案,请查看Otto(由Square制作)Link to the library here