正确更换碎片

时间:2016-01-15 21:42:55

标签: android android-fragments

我有一个活动名为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;
        }
    }
}

有人可以解释为什么一个在另一个上面吗?非常感谢!

1 个答案:

答案 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