java - Android how toggle with the button in toolbar to open/close navigation drawer with Fragments -
i new in android development after reading many tutorials , documentation , spending time managed create navigation drawer toolbar. problem can open drawer swiping left side of screen (not capable open/close drawer toolbar) don't know how in oncreateview can access navigation drawer id not set in oncreateview's setcontentview set in oncreate's setcontentview of class. use fragments. attach entire code , appreciate if button in toolbar ( id burger_btn) how can change code open , close drawer. thanks
############### dashboardactivity.java
public class dashboardactivity extends actionbaractivity implements messagereceived,navigationdrawerfragment.navigationdrawercallbacks { /** * fragment managing behaviors, interactions , presentation of navigation drawer. */ private navigationdrawerfragment mnavigationdrawerfragment; /** * used store last screen title. use in */ private charsequence mtitle; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.navigation_drawer); mnavigationdrawerfragment = (navigationdrawerfragment) getsupportfragmentmanager().findfragmentbyid(r.id.navigation_drawer); mtitle = gettitle(); // set drawer. mnavigationdrawerfragment.setup( r.id.navigation_drawer, (drawerlayout) findviewbyid(r.id.drawer_layout)); } @override public void onnavigationdraweritemselected(int position) { // update main content replacing fragments fragmentmanager fragmentmanager = getsupportfragmentmanager(); fragmentmanager.begintransaction() .replace(r.id.container, placeholderfragment.newinstance(position + 1)) .commit(); } @override public boolean oncreateoptionsmenu(menu menu) { if (!mnavigationdrawerfragment.isdraweropen()) { // show items in action bar relevant screen // if drawer not showing. otherwise, let drawer // decide show in action bar. return true; } return super.oncreateoptionsmenu(menu); } @override public boolean onoptionsitemselected(menuitem item) { // handle action bar item clicks here. action bar // automatically handle clicks on home/up button, long // specify parent activity in androidmanifest.xml. int id = item.getitemid(); return super.onoptionsitemselected(item); } /** * placeholder fragment containing simple view. */ public static class placeholderfragment extends fragment { /** * fragment argument representing section number * fragment. */ private static final string arg_section_number = "section_number"; /** * returns new instance of fragment given section * number. */ public static placeholderfragment newinstance(int sectionnumber) { placeholderfragment fragment = new placeholderfragment(); bundle args = new bundle(); args.putint(arg_section_number, sectionnumber); fragment.setarguments(args); return fragment; } public placeholderfragment() { } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { final view rootview = inflater.inflate(r.layout.dashboard_activity, container, false); lbl_notifications_amount = (textview) rootview.findviewbyid(r.id.lbl_notifications_amount); // set toolbar replace action bar. toolbar toolbar = (toolbar) rootview.findviewbyid(r.id.toolbar); ((actionbaractivity) getactivity()).setsupportactionbar(toolbar); ((actionbaractivity) getactivity()).getsupportactionbar().setdisplayshowtitleenabled(false); toolbar.settitletextcolor(getresources().getcolor(android.r.color.white)); // here don't know how navigation drawer id layout connected oncreate not oncreateview?
/* drawerlayout mdrawerlayout = (drawerlayout) rootview.findviewbyid(r.id.drawer_layout); actionbardrawertoggle mdrawertoggle = new actionbardrawertoggle( getactivity(), mdrawerlayout, toolbar, r.string.navigation_drawer_open, r.string.navigation_drawer_close ); mdrawerlayout.setdrawerlistener(mdrawertoggle); ((actionbaractivity) getactivity()).getsupportactionbar().setdisplayhomeasupenabled(true); ((actionbaractivity) getactivity()). getsupportactionbar().sethomebuttonenabled(true); mdrawertoggle.syncstate(); */ return rootview; } } } ########################## navigationdrawerfragment.java /** * fragment used managing interactions , presentation of navigation drawer. * see <a href="https://developer.android.com/design/patterns/navigation-drawer.html#interaction"> * design guidelines</a> complete explanation of behaviors implemented here. */ public class navigationdrawerfragment extends fragment { /** * remember position of selected item. */ private static final string state_selected_position = "selected_navigation_drawer_position"; /** * per design guidelines, should show drawer on launch until user manually * expands it. shared preference tracks this. */ private static final string pref_user_learned_drawer = "navigation_drawer_learned"; /** * pointer current callbacks instance (the activity). */ private navigationdrawercallbacks mcallbacks; /** * helper component ties action bar navigation drawer. */ private actionbardrawertoggle mdrawertoggle; private drawerlayout mdrawerlayout; // private listview mdrawerlistview; private view mfragmentcontainerview; private int mcurrentselectedposition = 0; private boolean mfromsavedinstancestate; private boolean muserlearneddrawer; public navigationdrawerfragment() { } @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // read in flag indicating whether or not user has demonstrated awareness of // drawer. see pref_user_learned_drawer details. sharedpreferences sp = preferencemanager.getdefaultsharedpreferences(getactivity()); muserlearneddrawer = sp.getboolean(pref_user_learned_drawer, true); if (savedinstancestate != null) { mcurrentselectedposition = savedinstancestate.getint(state_selected_position); mfromsavedinstancestate = true; } // select either default item (0) or last selected item. selectitem(mcurrentselectedposition); } @override public void onactivitycreated(bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); // indicate fragment influence set of actions in action bar. sethasoptionsmenu(true); } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view simplefragmentview = inflater.inflate(r.layout.fragment_navigation_drawer,container,false); return simplefragmentview; } public boolean isdraweropen() { return mdrawerlayout != null && mdrawerlayout.isdraweropen(mfragmentcontainerview); } /** * users of fragment must call method set navigation drawer interactions. * * @param fragmentid android:id of fragment in activity's layout. * @param drawerlayout drawerlayout containing fragment's ui. */ public void setup(int fragmentid, drawerlayout drawerlayout) { mfragmentcontainerview = getactivity().findviewbyid(fragmentid); mdrawerlayout = drawerlayout; // set custom shadow overlays main content when drawer opens mdrawerlayout.setdrawershadow(r.drawable.drawer_shadow, gravitycompat.start); // set drawer's list view items , click listener // actionbardrawertoggle ties the proper interactions // between navigation drawer , action bar app icon. mdrawertoggle = new actionbardrawertoggle( getactivity(), /* host activity */ mdrawerlayout, /* drawerlayout object */ r.string.navigation_drawer_open, /* "open drawer" description accessibility */ r.string.navigation_drawer_close /* "close drawer" description accessibility */ ) { @override public void ondrawerclosed(view drawerview) { super.ondrawerclosed(drawerview); if (!isadded()) { return; } getactivity().supportinvalidateoptionsmenu(); // calls onprepareoptionsmenu() } @override public void ondraweropened(view drawerview) { super.ondraweropened(drawerview); if (!isadded()) { return; } if (!muserlearneddrawer) { // user manually opened drawer; store flag prevent auto-showing // navigation drawer automatically in future. muserlearneddrawer = true; sharedpreferences sp = preferencemanager .getdefaultsharedpreferences(getactivity()); sp.edit().putboolean(pref_user_learned_drawer, true).apply(); } getactivity().supportinvalidateoptionsmenu(); // calls onprepareoptionsmenu() } }; // if user hasn't 'learned' drawer, open introduce them drawer, // per navigation drawer design guidelines. if (!muserlearneddrawer && !mfromsavedinstancestate) { mdrawerlayout.opendrawer(mfragmentcontainerview); } // defer code dependent on restoration of previous instance state. mdrawerlayout.post(new runnable() { @override public void run() { mdrawertoggle.syncstate(); } }); mdrawerlayout.setdrawerlistener(mdrawertoggle); } private void selectitem(int position) { mcurrentselectedposition = position; if (mdrawerlayout != null) { mdrawerlayout.closedrawer(mfragmentcontainerview); } if (mcallbacks != null) { mcallbacks.onnavigationdraweritemselected(position); } } @override public void onattach(activity activity) { super.onattach(activity); try { mcallbacks = (navigationdrawercallbacks) activity; } catch (classcastexception e) { throw new classcastexception("activity must implement navigationdrawercallbacks."); } } @override public void ondetach() { super.ondetach(); mcallbacks = null; } @override public void onsaveinstancestate(bundle outstate) { super.onsaveinstancestate(outstate); outstate.putint(state_selected_position, mcurrentselectedposition); } @override public void onconfigurationchanged(configuration newconfig) { super.onconfigurationchanged(newconfig); // forward new configuration drawer toggle component. mdrawertoggle.onconfigurationchanged(newconfig); } @override public void oncreateoptionsmenu(menu menu, menuinflater inflater) { // if drawer open, show global app actions in action bar. see // showglobalcontextactionbar, controls top-left area of action bar. if (mdrawerlayout != null && isdraweropen()) { } super.oncreateoptionsmenu(menu, inflater); } @override public boolean onoptionsitemselected(menuitem item) { if (mdrawertoggle.onoptionsitemselected(item)) { return true; } return super.onoptionsitemselected(item); } private actionbar getactionbar() { return ((actionbaractivity) getactivity()).getsupportactionbar(); } /** * callbacks interface activities using fragment must implement. */ public static interface navigationdrawercallbacks { /** * called when item in navigation drawer selected. */ void onnavigationdraweritemselected(int position); } } #################### navigation_drawer.xml <android.support.v4.widget.drawerlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".dashboardactivity"> <framelayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> <fragment android:id="@+id/navigation_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:name="com.packagename.navigationdrawerfragment" tools:layout="@layout/fragment_navigation_drawer" /> </android.support.v4.widget.drawerlayout> #################### fragment_navigation_drawer.xml <relativelayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:background="@color/light_green"> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancemedium" android:text="@string/dashboard" android:textcolor="@color/white" android:textstyle="bold" android:id="@+id/dashboardtextview" android:layout_alignparenttop="true" android:layout_centerhorizontal="true" android:layout_margintop="95dp" /> </relativelayout> ################ dashboard_activity.xml <?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/dark_blue"> <android.support.v7.widget.toolbar android:id="@+id/toolbar" android:minheight="?attr/actionbarsize" android:height="@dimen/activity_header_height" android:background="@color/light_green" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.toolbar> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancesmall" android:text="@string/dashboard" android:paddingtop="15dp" android:textsize="20sp" android:id="@+id/titletoolbar" android:layout_alignparenttop="true" android:layout_centerhorizontal="true" android:textcolor="@color/white" android:layout_alignbottom="@+id/toolbar" /> <imagebutton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginleft="10dp" android:layout_margintop="15dp" android:id="@+id/burger_btn" android:src="@drawable/burger_btn" android:background="@color/light_green" android:layout_marginright="5dp" /> <relativelayout android:id="@+id/badges_area" android:layout_width="match_parent" android:layout_height="@dimen/dashboard_badges_height" android:layout_above="@+id/btn_notifications" android:layout_alignparentleft="true" android:layout_alignparentstart="true" android:layout_marginleft="@dimen/dashboard_horizontal_margin" android:background="@drawable/badge_dashboard_area"> ... ... p.s:my intent id of burger_btn (the layout of dashboard_activity) open , close navigation drawer. appreciate if me changes in code need so.
if want open/close navigation drawer toolbar, try change layout of navigation_drawer be:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.toolbar android:id="@+id/toolbar" android:minheight="?attr/actionbarsize" android:height="@dimen/activity_header_height" android:background="@color/light_green" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.toolbar> <android.support.v4.widget.drawerlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".dashboardactivity"> <framelayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> <fragment android:id="@+id/navigation_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:name="com.packagename.navigationdrawerfragment" tools:layout="@layout/fragment_navigation_drawer" /> </android.support.v4.widget.drawerlayout> </linearlayout> and accordingly, move toolbar related codes fragment activity
Comments
Post a Comment