android - Clicking hamburger icon on Toolbar does not open Navigation Drawer -
i have simple android.support.v7.widget.toolbar
, trying open navigationdrawer pressing "hamburger" icon in top left corner. "hamburger" button visible, , when start pull left see animation on button pressing button not open/close navigationdrawer expect. have followed [google documentation][1] , still not able figure out. sorry confusion, below simplified code attempting use:
public class mainactivity extends appcompatactivity implements view.onclicklistener, googleapiclient.connectioncallbacks, googleapiclient.onconnectionfailedlistener { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); toolbar toolbar = (toolbar) findviewbyid(r.id.my_toolbar); setsupportactionbar(toolbar); getsupportactionbar().setdisplayhomeasupenabled(true); toolbar.setnavigationonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { log.d("nick", "button button button.................."); } }); mdrawerlayout = (drawerlayout) findviewbyid(r.id.drawer); navigationview n = (navigationview) findviewbyid(r.id.nav); mdrawerlayout.setonclicklistener(new view.onclicklistener(){ @override public void onclick(view v) { log.d("nick", "button button button.................."); } }); //mdrawerlayout.setdrawerlistener(mdrawertoggle); n.setnavigationitemselectedlistener(new navigationview.onnavigationitemselectedlistener() { @override public boolean onnavigationitemselected(menuitem menuitem) { switch (menuitem.getitemid()) { ////....... } mdrawerlayout.closedrawers(); // close drawer return true; } }); @override public boolean onoptionsitemselected(menuitem item) { log.d("nick","cwecnewkvneripnviewnfvipewnvipewnvpiewnvpiewnvpiewnvpirwnvprwvpo"); switch (item.getitemid()) { case android.r.id.home: mdrawerlayout.opendrawer(gravitycompat.start); // open drawer log.d("nick","cwecnewkvneripnviewnfvipewnvipewnvpiewnvpiewnvpiewnvpirwnvprwvpo"); return true; } return super.onoptionsitemselected(item); } @override public void onconfigurationchanged(configuration newconfig) { super.onconfigurationchanged(newconfig); mdrawertoggle.onconfigurationchanged(newconfig); } @override public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.drawer, menu); return true; } }
}
and not of log debug statements when running.
this issue have: https://stackoverflow.com/a/26636045/1489990. i've followed , doesn't work.
it understanding setnavigationonclicklistener
called when hamburger icon pressed, , focusing efforts event handled because when press button not log statement. let me know if idea incorrect. https://developer.android.com/reference/android/widget/toolbar.html#setnavigationonclicklistener(android.view.view.onclicklistener)
my layouts:
activitymain.xml
<relativelayout xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/d" android:background="@drawable/home_wall"> <android.support.v7.widget.toolbar android:id="@+id/my_toolbar" android:layout_height="wrap_content" android:layout_width="match_parent" android:minheight="?attr/actionbarsize" android:background="?attr/colorprimary" android:layout_marginbottom="10dp" app:theme="@style/themeoverlay.appcompat.dark.actionbar" android:layout_margintop="25dp" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" /> <android.support.v4.widget.drawerlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:id="@+id/drawer" android:layout_height="match_parent" android:fitssystemwindows="true"> <imageview android:layout_width="fill_parent" android:layout_height="200dp" android:id="@+id/imageview" android:src="@drawable/trans2" android:layout_alignparenttop="true" android:layout_margintop="10dp" android:layout_marginleft="5dp" android:layout_marginright="5dp" android:paddingbottom="300dp" /> <relativelayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/d8" android:layout_alignparenttop="true" android:layout_alignleft="@+id/imageview" android:layout_alignstart="@+id/imageview" android:paddingtop="0dp"> <button android:layout_width="75dp" android:layout_height="50dp" android:text="gallery" android:id="@+id/save_button" android:background="#dd2c00" android:textcolor="#fff" android:layout_below="@+id/purchases" android:layout_torightof="@+id/start_button" android:layout_toendof="@+id/start_button" /> <button android:layout_width="125dp" android:layout_height="50dp" android:text="store" android:id="@+id/purchases" android:background="#ff6e40" android:textcolor="#fff" android:layout_above="@+id/instructions_button6" android:layout_toleftof="@+id/start_button" android:layout_tostartof="@+id/start_button" android:layout_marginbottom="98dp" /> <button android:layout_width="75dp" android:layout_height="50dp" android:text="help" android:id="@+id/instructions_button6" android:background="#dd2c00" android:textcolor="#fff" android:layout_alignparentbottom="true" android:layout_toleftof="@+id/start_button" android:layout_tostartof="@+id/start_button" android:layout_marginleft="5dp" android:layout_marginbottom="10dp" /> <button android:layout_width="75dp" android:layout_height="300dp" android:text="start" android:id="@+id/start_button" android:background="#ff3d00" android:textcolor="#fff" android:layout_alignparentbottom="true" android:layout_centerhorizontal="true" android:layout_marginbottom="10dp" /> <button android:layout_width="125dp" android:layout_height="50dp" android:text="achievements" android:id="@+id/scores" android:background="#ff6e40" android:textcolor="#fff" android:layout_aligntop="@+id/purchases" android:layout_torightof="@+id/start_button" android:layout_toendof="@+id/start_button" /> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="welcome quiz!" android:id="@+id/textview" android:textcolor="#fff" android:textsize="20dp" android:layout_alignparenttop="true" android:layout_centerhorizontal="true" android:layout_margintop="70dp" /> <!-- sign-in button --> <com.google.android.gms.common.signinbutton android:id="@+id/sign_in_button" android:layout_width="110dp" android:layout_height="50dp" android:layout_above="@+id/start_button" android:layout_centerhorizontal="true" android:visibility="visible" /> <!-- sign-out button --> <button android:id="@+id/sign_out_button" android:layout_width="125dp" android:layout_height="wrap_content" android:text="sign out" android:visibility="invisible" android:background="#dd4b39" android:textcolor="#fff" android:layout_aligntop="@+id/sign_in_button" android:layout_centerhorizontal="true" android:layout_margintop="160dp" /> </relativelayout> <android.support.design.widget.navigationview android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:background="#fff" android:id="@+id/nav" app:headerlayout="@layout/drawer_header" app:menu="@menu/drawer"/> </android.support.v4.widget.drawerlayout>
drawer.xml
:
<menu xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_menu" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:title="google play games" android:icon="@drawable/ic_local_airport_white_48dp"> <menu> <item android:id="@+id/sign_in_drawer" android:icon="@drawable/games_controller_grey" android:title="sign in" /> <item android:id="@+id/ach" android:icon="@drawable/games_achievements" android:title="achievements" /> </menu> </item> <item android:title="start quiz" android:icon="@drawable/ic_local_airport_white_48dp"> <menu> <item android:id="@+id/quizstart25" android:icon="@drawable/ic_local_airport_white_48dp" android:title="25 questions" /> <item android:id="@+id/quizstart10" android:icon="@drawable/ic_local_airport_white_48dp" android:title="10 questions" /> </menu> </item> <group android:checkablebehavior="single"> <item android:id="@+id/gallery" android:icon="@drawable/ic_photo_library_white_48dp" android:title="gallery" /> <item android:id="@+id/stats" android:icon="@drawable/ic_toc_white_48dp" android:title="statistics" /> <item android:id="@+id/store" android:icon="@drawable/ic_shop_white_48dp" android:title="store" /> <item android:id="@+id/settings" android:icon="@drawable/ic_settings_white_48dp" android:title="settings" /> <item android:id="@+id/about" android:icon="@drawable/ic_info_white_48dp" android:title="about" /> </group> <item android:title="support"> <menu> <item android:id="@+id/help_drawer" android:icon="@drawable/ic_help_white_48dp" android:title="help" /> <item android:id="@+id/report" android:icon="@drawable/ic_report_problem_white_48dp" android:title="contact developer" /> <item android:id="@+id/gpluscommunity" android:icon="@drawable/btn_g_white_normal" android:title="google+ community" /> </menu> </item>
see answer similar post.
basically, skip actionbardrawertoggle
if don't need other things (like callbacks). can remove code , implement open/close drawer behavior, this:
@override public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case android.r.id.home: mdrawerlayout.opendrawer(gravitycompat.start); // open drawer return true; .... } return super.onoptionsitemselected(item); }
the code segment above works whether or not you're using navigationview. if using navigation view, in navigationview click listener:
navigationview.setnavigationitemselectedlistener( new navigationview.onnavigationitemselectedlistener() { @override public boolean onnavigationitemselected(menuitem menuitem) { // handle menu item clicks here. drawerlayout.closedrawers(); // close drawer return true; } });
update:
also, make sure activity extending appcompatactivity
(and not actionbaractivity
). see my answer here more info.
update2:
i debugged revised code. try this. should work now. read inline comments see changed , why:
import android.os.bundle; import android.support.design.widget.navigationview; import android.support.v4.view.gravitycompat; import android.support.v4.widget.drawerlayout; import android.support.v7.app.appcompatactivity; import android.support.v7.widget.toolbar; import android.util.log; import android.view.menu; import android.view.menuitem; public class mainactivity extends appcompatactivity { // view.onclicklistener, // googleapiclient.connectioncallbacks, // googleapiclient.onconnectionfailedlistener { drawerlayout mdrawerlayout; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); toolbar toolbar = (toolbar) findviewbyid(r.id.my_toolbar); setsupportactionbar(toolbar); // missing sethomeasupindicator getsupportactionbar().sethomeasupindicator(r.drawable.ic_menu); getsupportactionbar().setdisplayhomeasupenabled(true); // removed toolbar , drawer click listeners. // they're not needed open drawer. // drawer opens onoptionsitemselected(). mdrawerlayout = (drawerlayout) findviewbyid(r.id.drawer); navigationview n = (navigationview) findviewbyid(r.id.nav); n.setnavigationitemselectedlistener(new navigationview.onnavigationitemselectedlistener() { @override public boolean onnavigationitemselected(menuitem menuitem) { switch (menuitem.getitemid()) { ////....... } mdrawerlayout.closedrawers(); // close drawer return true; } }); } @override public boolean onoptionsitemselected(menuitem item) { log.d("nick", "cwecnewkvneripnviewnfvipewnvipewnvpiewnvpiewnvpiewnvpirwnvprwvpo"); switch (item.getitemid()) { // drawer/hamburger button case android.r.id.home: mdrawerlayout.opendrawer(gravitycompat.start); // open drawer log.d("nick", "cwecnewkvneripnviewnfvipewnvipewnvpiewnvpiewnvpiewnvpirwnvprwvpo"); return true; } return super.onoptionsitemselected(item); } } // removed onconfigurationchanged(). // it's not needed since you're no longer using actionbardrawertoggle.
update3: problem layout
looking @ activitymain.xml, see toolbar outside of drawerlayout. can't that. toolbar needs child of drawerlayout in order toolbar find proper context.
you need make drawerlayout root of activity. here's documentation, , specific quote is:
to add navigation drawer, declare user interface drawerlayout object root view of layout. inside drawerlayout, add 1 view contains main content screen (your primary layout when drawer hidden) , view contains contents of navigation drawer.
so basically, change activitymain.xml this:
<android.support.v4.widget.drawerlayout android:id="@+id/drawer" ... > <relativelayout android:id="@+id/d" ...> <android.support.v7.widget.toolbar android:id="@+id/my_toolbar" ... /> <!-- other content goes here --> </relativelayout> <android.support.design.widget.navigationview android:id="@+id/nav" ... /> </android.support.v4.widget.drawerlayout>
hopefully, takes care of problems.
Comments
Post a Comment