PopBackStack but keep the first fragment in android

前端 未结 10 565
[愿得一人]
[愿得一人] 2020-12-10 12:31

I am working on fragment transaction, and the backstack is like this:

fragA => fragB => fragC => fragD

I would like to return to f

10条回答
  •  我在风中等你
    2020-12-10 12:59

    Only a few days ago I start learning about fragments in Android. And I faced with this problem too. Here I show my solution and how I resolve this. Please, fix if my code is not right. What we have at this time? Acivity, many fragments and their backstack. We want open every fragment from Drawer menu and clear all other fragments from backstack. But, we must hold only one Home fragment. When we stay on Home fragment and user press Back button app is goeing closing.

    Activity.class

    protected void onCreate(Bundle savedInstanceState)
    {
        ...
        // adding Home fragment without adding transaction into backstack
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        ft.replace(R.id.container, HomeFragment.newInstance("args"), null);
        ft.commit();
    }
    
    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
            finish();
        }
    }
    
    public void addFragmentFromMenu(Fragment fragment){
        String backStateName =  fragment.getClass().getName();
        clearBackStack();
        FragmentManager manager = getSupportFragmentManager();
        if(manager.getBackStackEntryCount()> 0)
        {
            boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
    
            if (!fragmentPopped && manager.findFragmentByTag(backStateName) == null) {
                //fragment not in back stack, create it.
                addFragment(fragment, manager, backStateName);
            }
        }
        else // no fragments
        {
            addFragment(fragment, manager, backStateName);
        }
    }
    
    public void addFragment(Fragment fragment, FragmentManager manager, String backStateName)
    {
        FragmentTransaction ft = manager.beginTransaction();
        ft.replace(R.id.container, fragment, backStateName);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.addToBackStack(backStateName);
        ft.commit();
    }
    
    public void clearBackStack() {
        getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
    

    And on click on drawer menu item

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
    
        int id = item.getItemId();
    
        if (id == R.id.nav_camera) {
            addFragmentFromMenu(CameraFragment.newInstance("cam1", "cam2"));
        } else if (id == R.id.nav_gallery) {
            addFragmentFromMenu(TestFragment.newInstance("test1","test2"));
        }
    
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
    

提交回复
热议问题