android-fragments 片段使应用程序在按下后退出,而不是加载父Activity

t0ybt7op  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(150)

我正在处理一个场景,其中我有一个名为HomeActivity的Activity,其中包含BottomAppBar,在该Activity中,当用户单击底部应用栏中的图标时,我正在加载片段。现在我面临的问题是,当我从主页Activity加载片段时,它会打开,但在按下后,它会退出应用,而不是重新加载主页Activity布局。相反,我想加载主页活动,每当按下返回在任何加载的片段代码段内附上下面:

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @SuppressLint("NonConstantResourceId")
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                switch (item.getItemId()) {

                    case R.id.homePage:
                         fragment = new Fragment1();
                        break;

                    case R.id.wallet:
                        fragment = new Fragment2();
                        break;

                    case R.id.myorders:
                        fragment = new Fragment3();
                        break;

                    case R.id.search:
                         fragment = new Fragment4();
                        break;
                }
                getSupportFragmentManager().beginTransaction().replace(R.id.rl_mainLayout, fragment).commit();
                return true;
            }
        });

此外,我有一个覆盖方法onBackPressed(),它包含对方法finishAffinity()的调用

@Override
    public void onBackPressed() {
        finishAffinity();
    }
nuypyhwy

nuypyhwy1#

只是不要总是调用finishAffinity(),它会破坏你的导航流...你应该在那里调用super以获得正确的行为

@Override
public void onBackPressed() {
    super.onBackPressed();
}

finishAffinity()只是关闭所有的activity。真实的的问题是为什么你在onBackPressed中有故意的finishAffinity()调用,以及为什么你想知道它是工作的(不切换片段,只是关闭HomeActivity和其他,如果在后台的activitys堆栈上)
如果您确实需要finishAffinity()调用,您可能应该仅在第一个Fragment可见时进行调用

@Override
public void onBackPressed() {
    if (isFirstFragmentVisible()) {
        finishAffinity();
        return; // prevent super call, handled
    }
    super.onBackPressed();
}

isFirstFragmentVisible()由所有者作为家庭作业实现,最简单方法可能是在此方法中检查当前加载到R.id.rl_mainLayout中的Fragment(有用的可能是findFragmentById()findFragmentByTag()

ht4b089n

ht4b089n2#

根据我的假设,你正在尝试做的是。你有4个片段在家庭活动。假设用户点击片段2,然后如果他点击返回,那么片段1应该显示,而不是飞溅或应用程序退出。为此,使用下面的代码。

@Override
public void onBackPressed() {
    if (currentFragment instanceOf Fragment1) {
       super.onBackPressed();
    }
    else
   {  getSupportFragmentManager().beginTransaction().replace(R.id.rl_mainLayout, 
      fragment1).commit();
   }
    
}

默认情况下,将currentFragment值设置为等于fragment1,然后在onNavigationItemSelected上相应地更改其值。

相关问题