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

前端 未结 5 1452
离开以前
离开以前 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:05

    You need to disable swipe and disable the actionbar home button:

    Use the below code that builds on the code already given to disable swipe

      public void setDrawerState(boolean isEnabled) {
            if ( isEnabled ) {
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
                mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED);
                mDrawerToggle.setDrawerIndicatorEnabled(true);
                mDrawerToggle.syncState();
                getActivity().getActionBar().setHomeButtonEnabled(true);
    
            }
            else {
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
                mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
                mDrawerToggle.setDrawerIndicatorEnabled(false);
                mDrawerToggle.syncState();
                getActivity().getActionBar().setHomeButtonEnabled(false);
            }
        }
    
    0 讨论(0)
  • 2020-12-12 14:16

    Short Code

    public void setDrawerState(boolean isEnabled) {
        if ( isEnabled ) {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
            drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED);
            drawerToggle.setDrawerIndicatorEnabled(true);
            drawerToggle.syncState();
    
        }
        else {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            drawerToggle.setDrawerIndicatorEnabled(false);
            drawerToggle.syncState();
        }
    }
    
    0 讨论(0)
  • 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();
    }
    
    0 讨论(0)
  • 2020-12-12 14:21

    This is only part of the solution that I arrived at, but it was quite hard to figure out this bug, so I'm leaving this here for posterity's sake.

    This how I was defining the ListView for my navigation drawer:

    <ListView
        android:id="@+id/listview_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start|bottom"
        android:background="#111"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />
    

    Even after calling setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) I was still able to slide the drawer open.

    However, after changing the layout_gravity to "start" this problem seems to be resolved.

    I was able to reproduce this issue in a sample, navigation-drawer-only app, so it does appear to be a reproducible issue not unique to my situation.

    0 讨论(0)
  • 2020-12-12 14:22

    Building on sonida's answer. After calling setDrawerIndicatorEnabled(false), onNavigateUp wasn't being called still. So, I just created a new onClickListener that called it:

    public void setDrawerState(boolean isEnabled) {
        if ( isEnabled ) {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
            drawerToggle.setDrawerIndicatorEnabled(true);
            drawerToggle.syncState();
    
        }
        else {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            drawerToggle.setDrawerIndicatorEnabled(false);
            drawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onSupportNavigateUp();
                }
            });
            drawerToggle.syncState();
        }
    }
    

    also I think

    drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED);
    

    has been depreciated, but it works fine without it.

    0 讨论(0)
提交回复
热议问题