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 fragmentmanagers 'backstack'. code check size of backstack calling getfragmentmanager.getbackstackentrycount(). if number greater zero, know have fragmenttransactions 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

Popular posts from this blog

javascript - Karma not able to start PhantomJS on Windows - Error: spawn UNKNOWN -

c# - Display ASPX Popup control in RowDeleteing Event (ASPX Gridview) -

Nuget pack csproj using nuspec -