【问题标题】:Onbackpressed redirect to particular fragmentOnbackpressed 重定向到特定片段
【发布时间】:2017-03-16 04:19:01
【问题描述】:

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

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

【问题讨论】:

  • 支付成功后,移除其他所有fragment,显示SuccessfulPayment页面,几秒后移除
  • 怎么做??
  • 试试这个用 if(!activeFragment.onBackPressed()) 替换你的 if 条件,我认为它会正常工作

标签: android android-fragments navigation-drawer onbackpressed


【解决方案1】:

覆盖您的 onBackPress 方法:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不想去上一个片段..只为支付成功
    【解决方案3】:

    你应该在抽象类片段中模拟如下功能

        /**
         * 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
            }
        }
    

    【讨论】:

    • 什么是 mSelectedFragment
    • 片段处于可见状态,可以与用户界面集成
    • 我在哪里可以调用这个方法
    【解决方案4】:

    在您的onBackPressed() 中这样做:

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

    【讨论】:

      【解决方案5】:

      您可以在 Application 类中设置一些全局变量(付款成功时为 true,否则为 false),在您的活动的 onbackpressed 中只需检查该变量是否为真。然后在您的活动的 backpressed 中调用此函数。

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

      【讨论】:

        【解决方案6】:

        用途:

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

        不要这样做:

        fragmentTransaction.addToBackStack(null);
        

        【讨论】:

        • 只调用那个主片段,但不要使用 addToBackStack
        • 但是我在哪里可以调用这个
        • 实际上,后退按钮不应该将用户带到任何地方,只需将用户保留在那里并添加按钮并将用户带到 homeFragment
        【解决方案7】:

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

         public int count;
        

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

        现在将其包含在您的主要活动中

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多