片段中的onBackPressed()

时间:2018-10-01 12:05:27

标签: android android-fragments android-activity fragment android-fragmentactivity

我在一个活动中有三个Fragment,用于

的FragmentTransaction

片段A到片段B, 片段B到片段C

工作正常,但是在onBackPressed()上它会像

一样流动

片段C到片段B,片段B到片段A,

但是当onBackPressed()对于片段A时,它将关闭该片段,我不想关闭片段A,这是我的代码。

在OnNavigationItemSelectedListener上。

private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment fragment;
        switch (item.getItemId()) {
            case R.id.navigation_home:
                fragment = new HomeFragment();
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.frame_container, fragment);
                transaction.commit();

                return true;
            case R.id.navigation_my_orders:
                fragment = new MyOrdersFragment();
                loadFragment(fragment);
                return true;
            case R.id.navigation_profile:
                fragment = new ProfileFragment();
                loadFragment(fragment);
              return true;
        }

        return false;
    }
};

用于加载片段。

 private void loadFragment(Fragment fragment) {
    // load fragment
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.right_enter, R.anim.right_enter);
    transaction.replace(R.id.frame_container, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

如何解决,请告诉我。

2 个答案:

答案 0 :(得分:1)

onBackPressed方法由包含您的片段的Activity处理。

在“活动”中,您需要覆盖onBackPressed方法

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

super.onBackPressed将删除您的片段,您可以添加一个条件,如果您在FragmentA中,则不要触发该条件

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

}

您可以通过多种方法来查找当前在屏幕上显示的片段。

答案 1 :(得分:0)

请在您的活动中添加代码。

   override fun onBackPressed() {
            if (supportFragmentManager.backStackEntryCount > 0)
                supportFragmentManager.popBackStack()
            else {
           }
        }

用于加载片段

private void loadFragment(Fragment fragment) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.right_enter, R.anim.right_enter);
    transaction.add(R.id.frame_container, fragment);
    transaction.addToBackStack(fragment.getClass().toString());
    transaction.commit();
}

或者您可以使用以下代码获取当前片段,并检查其是否为FragemntA。

override fun onBackPressed() {
val fragment = supportFragmentManager.findFragmentById(getContainer())
        if(fragment !is FragmentA){
            supportFragmentManager.popBackStack()
        }
    }