Zin Win Htet
Zin Win Htet

Reputation: 2565

Toggle button not working for navigation drawer for the first time

I saw similar questions but answers are no use. That's why I post it. Here is how I setup my Drawer at FragmentDrawer.java.

public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
    containerView = getActivity().findViewById(fragmentId);
    mDrawerLayout = drawerLayout;
    toolBar = toolbar;
    onDrawerOpen();
    mDrawerToggle.setDrawerIndicatorEnabled(false);
    mDrawerToggle.setHomeAsUpIndicator(R.drawable.drawer);
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });
    mDrawerToggle.setToolbarNavigationClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            onDrawerOpen();
        }
    });
}

Here is onDrawerOpen method.

private void onDrawerOpen() {
    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout,
            toolBar, R.string.drawer_open, R.string.drawer_close) {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
            toolBar.setAlpha(1 - slideOffset / 2);
        }
    };
}

And call from MainActivity like this.

drawerFragment.setUp(R.id.fragment_navigation_drawer, mDrawer, mToolbar);

Upvotes: 0

Views: 1693

Answers (2)

Abdullah alkış
Abdullah alkış

Reputation: 333

in your Xml file you must change visibility of NavigationView visible

   <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        android:visibility="visible"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer">
    </android.support.design.widget.NavigationView>

Upvotes: 3

Mike M.
Mike M.

Reputation: 39191

After you first initialize the ActionBarDrawerToggle by calling onDrawerOpen(), you call setDrawerIndicatorEnabled(false), which disables the indicator, and causes any clicks to be routed to the Navigation click listener. Upon the first click, onDrawerOpen() is called again, which re-initializes the toggle, and it then works as expected.

It's unclear exactly what you're trying to do, but if you just want the standard toggle behavior, move the toggle initialization to the setup() method, and remove the setDrawerIndicatorEnabled() and setToolbarNavigationClickListener() calls.

public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
    containerView = getActivity().findViewById(fragmentId);
    mDrawerLayout = drawerLayout;
    toolBar = toolbar;

    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout,
                                              toolBar, R.string.drawer_open,
                                              R.string.drawer_close) {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
            toolBar.setAlpha(1 - slideOffset / 2);
        }
    };

    mDrawerToggle.setHomeAsUpIndicator(R.drawable.drawer);
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });
}

Upvotes: 1

Related Questions