【问题标题】:How to handle BackPress in fragments?如何在片段中处理 BackPress?
【发布时间】:2017-08-28 11:53:43
【问题描述】:

我的应用程序中有多个片段,使用 doubleBackPress 退出。问题是,无论在 Activity 上显示哪个片段,都会激活退出的 doubleBackPress。

这是我尝试过的。

MainActivity 中的代码

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        if (doubleBackToExitPressedOnce) {
            if (getFragmentManager().getBackStackEntryCount() > 0) {
                getFragmentManager().popBackStack();
            } else {
                super.onBackPressed();
            }
            return;
        }

        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this, "Press back again to exit", Toast.LENGTH_SHORT).show();

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run(){
                doubleBackToExitPressedOnce=false;
            }
        }, 2000);
    }
}

这就是我启动片段的方式。

fragmentManager = getFragmentManager() ;
fragmentTransaction  = fragmentManager.beginTransaction();
CategoryFragment categoryFragment = new CategoryFragment();
fragmentTransaction.replace(R.id.container,categoryFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

【问题讨论】:

    标签: android android-fragments onbackpressed fragment-backstack


    【解决方案1】:

    您可以根据需要参考以下代码。如果您没有使用 v4 支持片段,那么您必须使用 getFragmentManager() 而不是 getSupportFragmentManager() 来获取 backstack 计数。这里我使用布尔值来检查是否点击了返回,如果在2秒内没有再次点击,它将再次变为false。

    boolean doubleBackToExitPressedOnce = false;
        @Override
        public void onBackPressed() {
            //Checking for fragment count on backstack
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                getSupportFragmentManager().popBackStack();
            } else if (!doubleBackToExitPressedOnce) {
                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 {
                super.onBackPressed();
                return;
            }
        }
    

    希望对你有帮助。

    【讨论】:

    • 我用你的整个代码替换了我的 else 部分,用 getFragmentManager 替换了 getSupportFragmentManager。它就像魅力一样。非常感谢
    • @Ishanhrx 我很乐意为您提供帮助,请点赞我的回答。
    【解决方案2】:

    你正在替换片段试试这个:

    fragmentTransaction.add(R.id.container,categoryFragment);

    而不是

    fragmentTransaction.replace(R.id.container,categoryFragment);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多