Onbackpressed 重定向到特定片段

Onbackpressed redirect to particular fragment

在我的应用程序中,我有导航抽屉,所以我有一个 MainActivity,其余的是片段。我的应用程序运行良好。每当我按下后退按钮时,它都会重定向到之前的 fragment.it 工作 fine.but 我想要的是在成功付款后我显示成功付款页面,当用户按下后退按钮时我想重定向到 HomeFragment,但是现在它转到 Placeorder 片段。

@Override
    public void onBackPressed() {
        if(getFragmentManager().getBackStackEntryCount() == 0) {
            super.onBackPressed();
        }
        else {
            getFragmentManager().popBackStack();
        }
    }

你应该在抽象class片段

中模拟如下功能
    /**
     * Handle "Back" key pressed.
     * @return TRUE if the "Back" key pressed was handled. FALSE indicate it's not handled and parent class can handle it.
     */
    public abstract boolean onBackPressed()

而在 MainActivity 中,您将处理此函数

     @Override
    public void onBackPressed() {
        if (mSelectedFragment != null && mSelectedFragment.onBackPressed()) {
            return;
        } else {
            super.onBackPressed
        }
    }

使用:

fragmentTransaction.replace(R.id.fragment_container, mFeedFragment);
fragmentTransaction.commit();

不要这样做:

fragmentTransaction.addToBackStack(null);

一种方法是在打开新片段时保存前一个片段 (previousFragment) 变量,并在您位于第一个片段或占位符片段中时将其设为 null ....然后检查 previousFragment 内部的值onBackPressed 方法,如果为 null 则执行退出操作,否则用 previousFragment 替换片段,这样您将在返回时返回到上一个片段。

在你的 onBackPressed() 中这样做:

@Override
    public void onBackPressed() {
        if(getSupportFragmentManger.findFragmentByTag("paymentFragment") != null){
          //add homeFragment;
        }  
        else{
            if(getFragmentManager().getBackStackEntryCount() == 0) {
                super.onBackPressed();
            }
            else {
                getFragmentManager().popBackStack();
            }
        }
    }

覆盖您的 onBackPress 方法:

@Override
public void onBackPressed() {
    if (fragment != null && fragment.getChildFragmentManager().getBackStackEntryCount() > 0){
    fragment.getChildFragmentManager().popBackStack();
    }else {
    super.onBackPressed();
    }
}

您可以在应用程序 class 中设置一些全局变量(付款成功时为真,否则为假),并在 activity 的 onbackpressed 中检查变量为真或 not.Then您的 activity 调用此函数后退。

  public void clearBackStack() {
        FragmentManager manager = getSupportFragmentManager();
        if (manager.getBackStackEntryCount() > 0) {
            FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
            manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
    }

按照这个简单的方法 声明一个整数为

 public int count;

在您的主页中将此计数初始化为 count=0

现在将其包含在您的主要内容中 activity

  @Override
public void onBackPressed() {
    if (count == 1) {
        if (exit) {
            super.onBackPressed();
            return;
        } else {
            Toast.makeText(this, "Press Back again to Exit.", Toast.LENGTH_SHORT).show();
            exit = true;
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    exit = false;
                }
            }, 2000);
        }
    }else {
        toolbar.setTitle("Home");
        mDrawerLayout.closeDrawers();
        count=1;
        display(0);
    }
}