如何在片段中实现onBackPressed()?

家住魔仙堡 提交于 2020-02-27 19:40:40

有没有一种类似于我们在Android Activity中实现的方式可以在Android Fragment中实现onBackPressed()

由于片段生命周期没有onBackPressed() 。 在Android 3.0片段中还有其他替代方法可以替代onBackPressed()吗?


#1楼

根据@HaMMeRed的回答,这里是伪代码,它应该如何工作。 可以说您的主要活动称为BaseActivity ,它具有子片段(如SlidingMenu lib示例中的片段)。 步骤如下:

首先,我们需要创建接口和实现其接口的类以具有通用方法

  1. 创建类接口OnBackPressedListener

    public interface OnBackPressedListener { public void doBack(); }
  2. 创建实现OnBackPressedListener技能的OnBackPressedListener

    public class BaseBackPressedListener implements OnBackPressedListener { private final FragmentActivity activity; public BaseBackPressedListener(FragmentActivity activity) { this.activity = activity; } @Override public void doBack() { activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } }
  3. 从现在开始,我们将处理代码BaseActivity及其片段

  4. 在类BaseActivity上创建私有侦听BaseActivity

    protected OnBackPressedListener onBackPressedListener;
  5. 创建方法以在BaseActivity设置侦听BaseActivity

    public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) { this.onBackPressedListener = onBackPressedListener; }
  6. 在重写onBackPressed实现类似的东西

    @Override public void onBackPressed() { if (onBackPressedListener != null) onBackPressedListener.doBack(); else super.onBackPressed();
  7. onCreateView的片段中,您应该添加我们的监听器

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { activity = getActivity(); ((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity)); View view = ... ; //stuff with view return view; }

瞧,现在当您在片段中单击返回时,您应该捕获自定义的返回方法。


#2楼

在片段之间进行过渡时,只需添加addToBackStack ,如下所示:

fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();

如果编写addToBackStack(null) ,它将自行处理,但是如果提供标记,则应手动处理。


#3楼

不要实现ft.addToBackStack()方法,这样当您按下“后退”按钮时,您的活动将完成。

proAddAccount = new ProfileAddAccount();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, proAddAccount);
//fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

#4楼

这些都不容易实现,也不会以最佳方式发挥作用。

片段有一个可以调用onDetach的方法来完成这项工作。

@Override
    public void onDetach() {
        super.onDetach();
        PUT YOUR CODE HERE
    }

这将完成工作。


#5楼

解决方案很简单:

1)如果您具有所有片段都扩展的基本片段类,则将此代码添加到其类中,否则创建此类基本片段类

 /* 
 * called when on back pressed to the current fragment that is returned
 */
 public void onBackPressed()
 {
    // add code in super class when override
 }

2)在您的Activity类中,如下重写onBackPressed:

private BaseFragment _currentFragment;

@Override
public void onBackPressed()
{
      super.onBackPressed();
     _currentFragment.onBackPressed();
}

3)在您的Fragment类中,添加所需的代码:

 @Override
 public void onBackPressed()
 {
    setUpTitle();
 }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!