Disabling navigation drawer, toggling home-button/up-indicator in fragments

前端 未结 5 1450
离开以前
离开以前 2020-12-12 13:37

The setup

I have an activity whose contentView is an instance of a DrawerLayout, which has a navigation drawer with a drawer indicator displayed in th

5条回答
  •  难免孤独
    2020-12-12 14:20

    Building on answer by @sonida And after using the tweaks given by @luca992 and @jai.

    I tried above suggested codes But the "up" or "Back" arrow in left side of action bar was just not showing up in my app. But luckily I was able to fix that.

    I had to add this extra line of code in setNavigationDrawerState() [Ref: android.support.v7.app.ActionBarDrawerToggle.setHomeAsUpIndicator ]

    toggle.setHomeAsUpIndicator(R.drawable.ic_keyboard_backspace_white_24dp);

    I downloaded the drawable: ic_keyboard_backspace_white_24dp from Material.io

    Here is the complete code:

    MainActivity.java -> onCreate()

    DrawerLayout drawer;
    ActionBarDrawerToggle toggle;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Start: Code automatically generated by Android Studio
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();
        // End: Code automatically generated by Android Studio
    
        // I had to add this listener as the "back" arrow was totally unresponsive
        // Thanks to @luca992
        toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    
        // Start: Code automatically generated by Android Studio
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        // End: Code automatically generated by Android Studio
    
        // More custom code for other stuff
        // ...
    }
    

    MainActivity.java -> setNavigationDrawerState()

    public void setNavigationDrawerState(boolean isEnabled) {
    if ( isEnabled ) {
        drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        toggle.setDrawerIndicatorEnabled(true);
        toggle.syncState();
    }
    else {
        drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        toggle.setDrawerIndicatorEnabled(false);
        // the extra line of code goes here
        toggle.setHomeAsUpIndicator(R.drawable.ic_keyboard_backspace_white_24dp);    
    
        toggle.syncState();
    }
    

    MainActivity.java -> onBackPressed()

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

    MainActivity.java -> startFragment() [dummy function for example]

    public void startFragment(){
        MyFrag myFrag = new MyFrag();
    
        getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.frag_container ,myFrag)
            .addToBackStack(null)
            .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
            .commit();
    }
    

    MyFrag.java --> onViewCreated()

    @Override
    public void onViewCreated (View view, Bundle savedInstanceState){
        super.onViewCreated(view, savedInstanceState);
    
        // Say, using an implemented interface Make call to MainActivitiy's  setNavigationDrawerState() passing false
        // setNavigationDrawerState(false)
    
        // ...
    }
    

    MyFrag.java --> onDestroyView()

    @Override
    public void onDestroyView(){
        // Say, using an implemented interface Make call to MainActivitiy's setNavigationDrawerState() passing true 
        // setNavigationDrawerState(true)
    
        super.onDestroyView();
    }
    

提交回复
热议问题