是否有一种方法,我们可以实现onBackPressed()在Android片段类似的方式,我们实现在Android活动?

因为Fragment的生命周期没有onBackPressed()。在android3.0片段中是否有其他替代方法来覆盖onBackPressed() ?


当前回答

在活动生命周期中,当我们使用FragmentActivity或AppCompatActivity时,总是android返回按钮处理FragmentManager事务。要处理backstack,我们不需要处理它的backstack计数或标记任何东西,但我们应该在添加或替换片段时保持专注。请找到以下片段来处理后退按钮的情况,

    public void replaceFragment(Fragment fragment) {

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (!(fragment instanceof HomeFragment)) {
            transaction.addToBackStack(null);
        }
        transaction.replace(R.id.activity_menu_fragment_container, fragment).commit();
    }

在这里,我不会为我的主页片段添加回堆栈,因为它是我应用程序的主页。如果将addToBackStack添加到HomeFragment,那么应用程序将等待删除活动中的所有片段,然后我们将得到空白屏幕,所以我保持以下条件,

if (!(fragment instanceof HomeFragment)) {
            transaction.addToBackStack(null);
}

现在,你可以看到之前添加的片段在活动和应用程序将退出时,到达HomeFragment。您还可以查看以下片段。

@Override
public void onBackPressed() {

    if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
        closeDrawer();
    } else {
        super.onBackPressed();
    }
}

其他回答

在mainActivity实现回调接口中

protected mainActivity.OnBackPressedListener onBackPressedListener;

public interface OnBackPressedListener {
    void doBack();
}

public void setOnBackPressedListener(mainActivity.OnBackPressedListener onBackPressedListener) {
    this.onBackPressedListener = onBackPressedListener;
}

@Override
public void onBackPressed() {
    if (onBackPressedListener != null) {
        onBackPressedListener.doBack();
    } else { 
        super.onBackPressed();
    }
}

在片段实现接口OnBackPressedListener,我们写在mainActivity

implements mainActivity.OnBackPressedListener

mainActivity是我的基本活动,在你的片段onCreateView方法中编写以下代码

((mainActivity) getActivity()).setOnBackPressedListener(this);

并实现OnBackPressedListener接口方法doBack

@Override
public void doBack() {
    //call base fragment 
}

现在使用doBack()方法调用你想要调用的fragment

根据AndroidX发布说明,AndroidX。活动1.0.0-alpha01发布并引入了ComponentActivity,一个现有FragmentActivity和AppCompatActivity的新基类。这个版本给我们带来了一个新功能:

你现在可以通过addOnBackPressedCallback注册一个OnBackPressedCallback来接收onBackPressed()回调,而不需要在你的活动中覆盖这个方法。

如何使用onDestroyView()?

@Override
public void onDestroyView() {
    super.onDestroyView();
}
   @Override
   public boolean onKeyDown(int keyCode, KeyEvent event)
    {
       if ((keyCode == KeyEvent.KEYCODE_BACK))
  {
           finish();
    }
       return super.onKeyDown(keyCode, event);
    }

注释任何下键相关的方法现在addToBackStack将工作。 谢谢

在Fragments中处理onBackPressed()的简单方法

步骤1: 在activity中创建一个静态布尔值。

public static Fragment_one;

步骤2: 在On Create方法中的MainActivity(持有片段的活动)上声明

Fragment_one=true;

步骤3:在MainActivity中覆盖onBackPressed()

@Override
public void onBackPressed() {

    if(Fragment_one) {
     //Back key pressed on fragment one

    }else {
      //Back key pressed on fragment two
    }
}

步骤4:在fragment_one上声明onCreateView方法

MainActivity.Fragment_one=true;

步骤5在fragment_two上声明onCreateView方法

MainActivity.Fragment_one=false;

注:此方法仅适用于两个片段。