【问题标题】:Proper Replacement of Fragments正确更换碎片
【发布时间】:2016-01-15 21:42:55
【问题描述】:

我有一个名为 A 的活动。该活动有 1 个框架布局,其中使用了片段。我有两个片段,片段 1 和片段 2。当 Activity 启动时,Fragment 1 填充 Frame Layout。

Fragment1 还包含一个按钮,当单击该按钮时,该按钮将在同一个框架布局中将其替换为 Fragment2。我的问题是,当我单击 Fragment1 中的那个按钮时,我应该实现该代码以便

A) Activity A 通过使用某种类型的布尔值的接口收到 Fragment 中的 onClick 通知,然后继续用 Fragment2 替换它。

B)在Fragment1自身内实现将Fragment1替换为Fragment2的代码 例如:

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;
        }
    }
}

有人能解释一下为什么会这样吗?非常感谢!

【问题讨论】:

  • I have one Activity Called A. The activity has 1 Frame Layout in which Fragments are used. I have two Fragments, Fragment1 and Fragment2. When the Activity is launched, Fragment 1 fills the Frame Layout. Fragment1 also contains a button that when clicked replaces it with Fragment2 within that same Frame Layout. My question is this, when I click that Button in Fragment1 should I implement that code so that 能否将此代码添加到您的问题中
  • 我会选择选项 A,因为 Fragment 本身不应该知道它的状态,即控制 Activity 的 FragmentManager
  • 好的,谢谢,我添加了选项B的代码示例

标签: android android-fragments


【解决方案1】:

一般来说,我所做的是使用某种接口,它存在于被替换的片段中(在本例中为片段 1)。然后,您的父活动将实现此接口,从而在作为该特定片段的父活动的活动之间建立契约。

当你按下你的按钮(或任何发生替换信号的事件)时,你会抓住你的活动将它投射到那个界面,并调用特定的方法。

例如片段内的信号事件

( (MyFragmentListener) getActivity()).onActionHappens();

其中 MyFragmentListener 是 Fragment 的内部类,而 onActionHappens() 是发送信号的方法。这有效地在您的片段和托管该片段的任何活动之间创建了一个合同。当您的操作发生时,您让活动知道,然后活动会覆盖适当的方法来处理事件。

还有其他方法可以做到这一点,但在最简单的层面上,这是可以做到的。

为什么不选择 B

选项 B 在片段之间创建紧密耦合,而您不一定想要。在实践中,您希望在片段和它的主机(或父级)之间进行耦合,即 Activity。此外,可能有许多活动使用该片段,因此您只需调用 getActivity() 即可抽象出有关使用它的特定活动的详细信息。在这种情况下,将片段和活动耦合是可以接受的,因为这两者当然是耦合的。我们知道这一点是因为如果没有关联的 Activity,片段就无法生存,因此可以利用这种紧密耦合。

总结

选择选项 A。这是最干净的路线,并且避免假设您必须在选项 B 中执行的实现细节。

它也是您拥有的基本解决方案,无需任何外部库或详细信息。如果您想要更高级的解决方案,请查看 Otto(由 Square 制作)Link to the library here

【讨论】:

  • 感谢您的周到回复,这是有道理的
  • 没问题。很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多