Sunday 15 January 2012

Android 5.0 Toolbar fragment backstack -



Android 5.0 Toolbar fragment backstack -

i've used new toolbar appcompat library replace action bar, , have set 1 might expect navigation drawer.

my problem pressing minimises app instead of cycling through backstack. if manually add together logic onbackpressed() pop stack, that's 1 solution, messes navigation drawer's selected item.

activity_main.xml

<linearlayout> <android.support.v7.widget.toolbar/> <android.support.v4.widget.drawerlayout> <framelayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"/> <listview android:id="@+id/navigation_drawer"/> </android.support.v4.widget.drawerlayout> </linearlayout>

mainactivity.java

private void setupdrawerandtoolbar() { toolbar toolbar = (toolbar) findviewbyid(r.id.toolbar); setsupportactionbar(toolbar); final drawerlayout drawerlayout = (drawerlayout) findviewbyid(r.id.drawer_layout); toggle = new actionbardrawertoggle(this, drawerlayout, toolbar, r.string.app_name, r.string.app_name); drawerlayout.setdrawerlistener(toggle); drawerlist.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { onnavigationdraweritemselected(position, true); drawerlayout.closedrawer(gravitycompat.start); } }); list<navigationdraweritem> items = new arraylist<>(); items.add(...); drawerlist.setadapter(new navigationdraweradapter(this, items)); drawerlist.setitemchecked(selectedindex, true); } ... private void onnavigationdraweritemselected(int position, boolean addtobackstack) { if (position == selectedindex) { return; } selectedindex = position; // update main content replacing fragments fragmentmanager manager = getfragmentmanager(); fragment fragment; switch (position) { case ...: fragment = new fragment(); break; default: throw new illegalargumentexception("invalid position"); } fragmenttransaction transaction = manager.begintransaction() .replace(r.id.container, fragment); if (addtobackstack) { transaction.addtobackstack(fragment.getclass().getname()); } transaction.commit(); }

came workaround:

private void onnavigationdraweritemselected(int position, boolean addtobackstack) { if (position == selectedindex) { return; } // update main content replacing fragments fragment fragment; switch (position) { case ...: fragment = new fragment(); break; default: throw new illegalargumentexception("invalid position"); } fragmenttransaction transaction = getfragmentmanager().begintransaction() .replace(r.id.container, fragment, fragment.getclass().getname()); if (addtobackstack) { transaction.addtobackstack(string.valueof(selectedindex)); } transaction.commit(); selectedindex = position; } ... @override public void onbackpressed() { int count = getfragmentmanager().getbackstackentrycount(); if (count > 0) { int index = integer.parseint( getfragmentmanager().getbackstackentryat(count - 1).getname()); getfragmentmanager().popbackstack(); selectedindex = index; return; } super.onbackpressed(); }

android android-fragments android-5.0-lollipop back-stack android-toolbar

No comments:

Post a Comment