【问题标题】:Exit app when press Back button in activity with multiple fragments in Navigation Drawer在导航抽屉中有多个片段的活动中按返回按钮时退出应用程序
【发布时间】:2014-06-18 04:47:20
【问题描述】:

我正在开发一个需要导航抽屉的应用程序。这个应用程序有 1 个 MainActivity 和大约 10 个片段。当我单击 MainActivity 中的 Navigation Drawer 图标时,它将显示 10 个片段,因此我可以选择它们中的每一个。

例如,我选择片段 A,然后是 B,然后是 C...到 F。当我在 Fragment F 并按下 Back 按钮时,它将带我回到 Fragment E,然后再返回它会将我带到 Fragment D...

我的问题是当我回到片段 A(当然是从片段 B)并再按一次返回按钮时,它会将我带到一个空白的白色屏幕(我认为这是主要的活动布局)。再按一次返回,应用程序将退出。

我想要的是当我回到片段 A(最后一个片段)并点击返回时,应用程序将立即退出,不再是空白的白屏

我在 SO 上搜索并找到了 1 个类似的问题,但还没有答案,所以我必须提出另一个问题

我该怎么做? 非常感谢

【问题讨论】:

  • 在您的 mainActivity 的 oncreate() 方法中,您应该添加片段 A 以避免白屏。
  • FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE) from here @MohammadKhatri 在加载时不会发生在他身上。
  • 是的,这可能会有所帮助,但我认为在加载中添加片段 A 将解决问题而无需添加到后台堆栈。 @piavgh 你能发布一些代码吗?

标签: android android-fragments navigation-drawer


【解决方案1】:

在倒数第二个屏幕退出应用程序

  public void onBackPressed() {

    if (manager.getBackStackEntryCount() > 1 ) {
        // If there are back-stack entries, leave the FragmentActivity
        // implementation take care of them.
        manager.popBackStack();

    } else {
        // Otherwise, ask user if he wants to leave :)
        new AlertDialog.Builder(this)
                .setTitle("Really Exit?")
                .setMessage("Are you sure you want to exit?")
                .setNegativeButton(android.R.string.no, null)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface arg0, int arg1) {
                        MainActivity.super.onBackPressed();
                    }
                }).create().show();
    }
}

【讨论】:

    【解决方案2】:

    从 Fragment A 中删除 addToBackStack()。 希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      我想我是另一个未回答问题的人,所以我想向您展示我的解决方法:

      我检查我的 FrameLayout 中是否有一个孩子。如果有的话,我会返回一个片段。并再次检查。因为我确实只知道白屏,所以我需要检查它是否还剩下 0 个孩子。如果还有一个fragment,就没有什么可做的了,但是如果childs == 0,你想要求离开activity。

      或者,如果您到达最后一个片段,您可以删除 AlertDialog 并关闭应用程序。

      @Override
      public void onBackPressed() {
          FrameLayout fl = (FrameLayout) findViewById(R.id.content_frame);
          if (fl.getChildCount() == 1) {
              super.onBackPressed();
              if (fl.getChildCount() == 0) {
                  new AlertDialog.Builder(this)
                          .setTitle("Close App?")
                          .setMessage("Do you really want to close this beautiful app?")
                          .setPositiveButton("YES",
                                  new DialogInterface.OnClickListener() {
      
                                      @Override
                                      public void onClick(DialogInterface dialog,
                                              int which) {
                                          finish();
                                      }
                                  })
                          .setNegativeButton("NO",
                                  new DialogInterface.OnClickListener() {
      
                                      @Override
                                      public void onClick(DialogInterface dialog,
                                              int which) {
                                      }
                                  }).show();
                  // load your first Fragment here
              }
          } else if (fl.getChildCount() == 0) {
              // load your first Fragment here
          } else {
              super.onBackPressed();
          }
      }
      

      【讨论】:

        【解决方案4】:

        我刚刚解决了我的类似问题。我改编了 Ali Azhar 的解决方案。由于我有启动屏幕活动,我不想终止应用程序,否则当我尝试恢复应用程序时(按下手机上的活动应用程序按钮并选择应用程序),应用程序会卡在启动屏幕中没有进行我的主要活动。所以不是

        MainActivity.super.onBackPressed();
        

        我用过这个:

        moveTaskToBack(true);
        

        显示主屏幕。我不需要用户的任何退出确认,所以我删除了对话框代码。我还想调整我的 replaceFragment(targetFragment, fragmentNameInBackStack) 方法以避免将片段添加到后台堆栈,如果它是第一个片段,但事实证明没有必要这样做,因为我们让如果后台堆栈中的片段多于,则管理器从后台堆栈中弹出,因此如果只有一个片段,那很好,我们退出。这很好,因为我想在不同的屏幕/片段之间保留我的后退导航行为。所以这里是代码:

        @Override
        public void onBackPressed() {
            FragmentManager manager = getSupportFragmentManager();
            if (manager.getBackStackEntryCount() > 1 ) {
                manager.popBackStack();
            } else {
                // if there is only one entry in the backstack, show the home screen
                moveTaskToBack(true);
            }
        }
        

        【讨论】:

          【解决方案5】:

          退出应用的简单方法只需粘贴以下代码即可

           @Override
              public void onBackPressed() {
                  FragmentManager manager = getSupportFragmentManager();
          
                  if (manager.getBackStackEntryCount() > 1) {
                      // If there are back-stack entries, leave the FragmentActivity
                      // implementation take care of them.
                      manager.popBackStack();
          
                  } else {
                      // Otherwise, ask user if he wants to leave :)
                      new AlertDialog.Builder(this)
                              .setTitle("Really Exit?")
                              .setMessage("Are you sure you want to exit?")
                              .setNegativeButton(android.R.string.no, null)
                              .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
          
                                  public void onClick(DialogInterface arg0, int arg1) {
                                      // MainActivity.super.onBackPressed();
                                      finish();
                                      moveTaskToBack(true);
                                  }
                              }).create().show();
                  }
          

          【讨论】:

            【解决方案6】:

            答案很晚。但我希望至少能帮助任何人回答这个问题。

            在以下代码的帮助下,我实现了双后按退出(它给 Toast “请再次单击以退出”,如果再按一次,则只有应用程序将退出。)

            getBackStackEntryCount() - 给出您的返回堆栈片段的当前计数。

            int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();

            如果此值==0,则返回堆栈中没有可用的片段。所以执行双后按退出代码。

            否则允许使用 super.onBackPressed();

            进行回压操作
            @Override
            public void onBackPressed() {
            
                int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
                //backStackEntryCount==0 -> no fragments more.. so close the activity with warning
                if (backStackEntryCount == 0){
            
                    if (homePressed) {
                        if (doubleBackToExitPressedOnce) {
                            super.onBackPressed();
            
                            return;
                        }
            
                        this.doubleBackToExitPressedOnce = true;
                        Toast.makeText(this, "Please click back again to exit", Toast.LENGTH_SHORT).show();
            
                        new Handler().postDelayed(new Runnable() {
            
                            @Override
                            public void run() {
                                doubleBackToExitPressedOnce = false;
                            }
                        }, 2000);
                    } else {
                        homePressed = true;
                    }
            
            }
                //some fragments are there.. so allow the back press action
                else {
                    super.onBackPressed();
                }
            
            }    
            

            全局声明这些变量

            boolean homePressed = true, doubleBackToExitPressedOnce = false;
            

            【讨论】:

              【解决方案7】:

              使用这个.. 简单的解决方案,但对我来说非常有效。这会在您点击最后一个打开的片段后关闭应用程序。

              @Override
              public void onBackPressed() {
                  if(getSupportFragmentManager().getBackStackEntryCount() == 1) {
                      moveTaskToBack(false);
                  }
                  else {
                      super.onBackPressed();
                  }
              }
              

              【讨论】:

                【解决方案8】:

                在 onBack 方法中检查片段管理器中是否有可用片段...如果它是 1 则使用 move taskback 方法关闭应用程序

                【讨论】:

                  【解决方案9】:

                  我想您可以避免按下后退按钮或在按下后退按钮时完成活动。通常,如果您使用的是导航抽屉,那么这根本不是问题,但您可以尝试。

                      @Override
                  public void onBackPressed()
                  {
                      // Do Here what ever you want do on back press;
                  }
                  

                  或者你可以去导航抽屉 http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/

                  【讨论】:

                    【解决方案10】:

                    这对我有用。

                    如果从 MainActivity 调用

                    supportFinishAfterTransition();
                    

                    如果从片段调用

                    getActivity().supportFinishAfterTransition();
                    

                    【讨论】:

                      【解决方案11】:

                      这个对我有用(退出双击退出片段)

                        int backButtonCount = 0;
                      
                      
                      @SuppressLint({"ResourceAsColor", "ResourceType"})
                      @Override
                      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                          View view = inflater.inflate(R.layout.fragment_home, container, false);
                          //binding fragment view
                      
                          view.setFocusableInTouchMode(true);
                          view.requestFocus();
                          view.setOnKeyListener((v, keyCode, event) -> {
                              Log.i("Fragment_Home", "keyCode: " + keyCode);
                              if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                      
                                  Log.e(TAG, "onCreateView: " + "Fragment Hom Key up");
                      
                      
                                  if (backButtonCount >= 1) {
                                      Intent intent = new Intent(Intent.ACTION_MAIN);
                                      intent.addCategory(Intent.CATEGORY_HOME);
                                      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                      intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                                      startActivity(intent);
                                       getActivity().finish();
                      
                      
                                  } else {
                                      Toast.makeText(getContext(), "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
                                      backButtonCount++;
                      
                      
                                      new Handler().postDelayed(() -> {
                      
                                          backButtonCount = 0;
                      
                                      }, 2000);
                      
                                  }
                      

                      【讨论】:

                        猜你喜欢
                        • 2014-12-28
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2020-12-26
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多