android - Replace Fragment with another on back button -
i'm trying override button because it's closing app when push on, have different fragments:
- fragment a: index (when press button, it's close app)
- fragment b (when press button go fragment a)
- fragment c (when press button go fragment a)
and have main activity: manage fragments (for have navigation drawer).
i found many posts on can't implement them:
on fragment b exemple:
@override public void onbackpressed(){ fragmentmanager fm = getsupportfragmentmanager(); fragment f = fm.findfragmentbyid(r.id.fragmentb); // fragment loaded in placeholder object tag = f.gettag(); // handling of tag here // call super method super.onbackpressed(); }
it cannot resolve onbackpressed() , getsupportfragmentmanager(), think don't use method correctely, how ?
activity:
import android.app.alertdialog; import android.content.dialoginterface; import android.graphics.typeface; import android.os.bundle; import android.support.v4.app.fragment; import android.support.v4.app.fragmentmanager; import android.support.v4.app.fragmenttransaction; import android.support.v4.widget.drawerlayout; import android.support.v7.app.appcompatactivity; import android.support.v7.widget.toolbar; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.textview; public class mainactivity extends appcompatactivity implements fragmentdrawer.fragmentdrawerlistener { private static string tag = mainactivity.class.getsimplename(); private toolbar mtoolbar; private fragmentdrawer drawerfragment; //initialisation de l activite avec les donnees necessaires @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mtoolbar = (toolbar) findviewbyid(r.id.toolbar); setsupportactionbar(mtoolbar); getsupportactionbar().setdisplayshowhomeenabled(true); drawerfragment = (fragmentdrawer)getsupportfragmentmanager().findfragmentbyid(r.id.fragment_navigation_drawer); drawerfragment.setup(r.id.fragment_navigation_drawer, (drawerlayout) findviewbyid(r.id.drawer_layout), mtoolbar); drawerfragment.setdrawerlistener(this); // affichage de la navigation displayview(0); } @override public boolean oncreateoptionsmenu(menu menu) { //ajout des items getmenuinflater().inflate(r.menu.menu_main, menu); return true; } @override public boolean onoptionsitemselected(menuitem item) { int id = item.getitemid(); if (id == r.id.action_settings) { return true; } return super.onoptionsitemselected(item); } @override public void ondraweritemselected(view view, int position) { displayview(position); } private void displayview(int position) { fragment fragment = null; string title = getstring(r.string.app_name); switch (position) { case 0: fragment = new accueil(); title = getstring(r.string.title_accueil); break; case 1: fragment = new nosoffres(); title = getstring(r.string.title_nosoffres); break; case 2: fragment = new demandegratuite(); title = getstring(r.string.title_demandegratuite); break; case 3: fragment = new contacteznous(); title = getstring(r.string.title_contact); break; case 4: fragment = new actualites(); title = getstring(r.string.title_actu); break; case 5: fragment = new mentionslegales(); title = getstring(r.string.title_mentions); break; default: break; } if (fragment != null) { fragmentmanager fragmentmanager = getsupportfragmentmanager(); fragmenttransaction fragmenttransaction = fragmentmanager.begintransaction(); fragmenttransaction.replace(r.id.container_body, fragment); fragmenttransaction.commit(); // libelle du toolbar textview titlet; titlet = (textview) findviewbyid(r.id.main_toolbar_title); titlet.settext(title); titlet.settypeface(typeface.createfromasset(getassets(), "fonts/gothambook.ttf")); } } }
@jujyfruits
i tryedbut doesn't work:
@override public void onbackpressed(){ fragment myfragment = getsupportfragmentmanager().findfragmentbyid(r.id.demande_gratuite); if (myfragment != null && myfragment.isvisible()) { alertdialog alertdialog = new alertdialog.builder(this).create(); alertdialog.settitle("reset..."); alertdialog.setmessage("test"); alertdialog.setbutton("ok", new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int which) { } }); alertdialog.show(); } super.onbackpressed(); } }
@autonomousapps
public class mainactivity extends appcompatactivity implements fragmentdrawer.fragmentdrawerlistener { private static string tag = mainactivity.class.getsimplename(); private toolbar mtoolbar; private fragmentdrawer drawerfragment; //initialisation de l activite avec les donnees necessaires @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mtoolbar = (toolbar) findviewbyid(r.id.toolbar); setsupportactionbar(mtoolbar); getsupportactionbar().setdisplayshowhomeenabled(true); drawerfragment = (fragmentdrawer)getsupportfragmentmanager().findfragmentbyid(r.id.fragment_navigation_drawer); drawerfragment.setup(r.id.fragment_navigation_drawer, (drawerlayout) findviewbyid(r.id.drawer_layout), mtoolbar); drawerfragment.setdrawerlistener(this); // affichage de la navigation displayview(0); } @override public boolean oncreateoptionsmenu(menu menu) { //ajout des items getmenuinflater().inflate(r.menu.menu_main, menu); return true; } @override public boolean onoptionsitemselected(menuitem item) { int id = item.getitemid(); if (id == r.id.action_settings) { return true; } return super.onoptionsitemselected(item); } @override public void ondraweritemselected(view view, int position) { displayview(position); } private void displayview(int position) { fragment fragment = null; string title = getstring(r.string.app_name); switch (position) { case 0: fragment = new accueil(); title = getstring(r.string.title_accueil); break; case 1: fragment = new nosoffres(); title = getstring(r.string.title_nosoffres); break; case 2: fragment = new demandegratuite(); title = getstring(r.string.title_demandegratuite); break; case 3: fragment = new contacteznous(); title = getstring(r.string.title_contact); break; case 4: fragment = new actualites(); title = getstring(r.string.title_actu); break; case 5: fragment = new mentionslegales(); title = getstring(r.string.title_mentions); break; default: break; } if (fragment != null) { fragmentmanager fragmentmanager = getsupportfragmentmanager(); fragmenttransaction fragmenttransaction = fragmentmanager.begintransaction(); fragmenttransaction.replace(r.id.container_body, fragment); fragmenttransaction.addtobackstack("name"); fragmenttransaction.commit(); // libelle du toolbar textview titlet; titlet = (textview) findviewbyid(r.id.main_toolbar_title); titlet.settext(title); titlet.settypeface(typeface.createfromasset(getassets(), "fonts/gothambook.ttf")); } } @override public void onbackpressed(){ fragmentmanager mgr = getsupportfragmentmanager(); if (mgr.getbackstackentrycount() == 0) { super.onbackpressed(); }else{ mgr.popbackstack(); } }
this use when navigating between fragments:
mainactivity.java:
@override public void onbackpressed() { // note: can use 'getsupportfragmentmanager()' fragmentmanager mgr = getfragmentmanager(); if (mgr.getbackstackentrycount() == 0) { // no backstack pop, calling super super.onbackpressed(); } else { mgr.popbackstack(); } }
edit second: please note want call super.onbackpressed()
if haven't handled (by, example, popping fragment manager's backstack).
for work, have add new fragments fragmentmanager
's backstack (addtobackstack()
). example (also in mainactivity.java):
private void displayview(int position) { fragment fragment = ...; // code here if (fragment != null) { fragmentmanager fragmentmanager = getsupportfragmentmanager(); fragmenttransaction fragmenttransaction = fragmentmanager.begintransaction(); fragmenttransaction.replace(r.id.container_body, fragment); // add line fragmenttransaction.addtobackstack("name"); // name can null fragmenttransaction.commit(); // libelle du toolbar textview titlet; titlet = (textview) findviewbyid(r.id.main_toolbar_title); titlet.settext(title); titlet.settypeface(typeface.createfromasset(getassets(), "fonts/gothambook.ttf")); } }
edit third (7/28): in oncreate(bundle)
method, first fragment transaction calling displayview(int)
method. displayview(int)
always adds fragment transactions backstack. not want. first fragment transaction should use fragmenttransaction.**add**(int, fragment)
, should not call addtobackstack(string)
. every transaction after first should call fragmenttransaction.**replace**(int, fragment)
, should call addtobackstack(string)
. reason first transaction "adding" fragment (your ui) empty container (it not "replacing" fragment). when transaction on backstack, means empty-container state also on backstack. when pop last transaction, displays blank ui.
edit first: when call addtobackstack(string name)
on fragmenttransaction
object (which obtain calling getfragmentmanager().begintransaction()
), adding fragmenttransaction
fragmentmanager
s 'backstack'. code check size of backstack calling getfragmentmanager.getbackstackentrycount()
. if number greater zero, know have fragmenttransaction
s on backstack. in such case, can call getfragmentmanager.popbackstack()
, pop last transaction off backstack--in other words, returning app last fragment on display.
if backstack entry county equals 0, means you're @ fragment a, , should instead call super.onbackpressed()
, , cause app exit.
Comments
Post a Comment