android - Don't understand viewpager life cycle with fragment -
i'm little bit dissapointed viewpager fragments, since 4 days try many solutions, without sucess.
i 'm beginner in fragments, follow great tutorial create viewpager. can rotate phone no problem fragments. must open new activity fragment within viewpager , go on host activity contain viewpager. in point can't fragment host activity when go fron activity b. don't understand can ?
exemple :
tabsessionactivity --> fragment --> activity b --> tabsessionactivity(fragment =null)
tabsessionactivity --> fragment -->rotate phone --> tabsessionactivity(fragment ok!)
here adapter :
public class mypageradapter extends fragmentpageradapter { private final list<fragment> fragments; private fragmentmanager mfragmentmanager; // on fournit à l'adapter la liste des fragments à afficher public mypageradapter(fragmentmanager fm, list<fragment> fragments) { super(fm); mfragmentmanager=fm; this.fragments = fragments; } @override public fragment getitem(int position) { for(fragment mfragment:fragments){ log.i("fragment tag , id"," fragmenttag:"+mfragment.gettag()+" fragmentid:"+mfragment.getid()+"nb fragments:"+this.fragments.size()); } return this.fragments.get(position); } @override public int getcount() { return this.fragments.size(); } public fragment getactivefragment(viewpager container, int position) { string name = makefragmentname(container.getid(), position); for(fragment mfragment:mfragmentmanager.getfragments()){ log.i("fragment tag , id"," fragmenttag:"+mfragment.gettag()+" fragmentid:"+mfragment.getid()+" nb fragments:"+this.mfragmentmanager.getfragments().size()); } return mfragmentmanager.findfragmentbytag(name); } private static string makefragmentname(int viewid, int index) { return "android:switcher:" + viewid + ":" + index; } }
then host activity :
public class tabssessionactivity extends sherlockfragmentactivity { private geolocatingservice mgeoservice; private mypageradapter mpageradapter; private viewpager mviewpager; // private myfragmentpageradapter mmyfragmentpageradapter; private dashboard_fragment fragment1; private osmmapfragment fragment2; private fragment1 fragment3; final igeolocatingservicelistener servicelistener = new igeolocatingservicelistener() { @override public void datachanged(final object data) { runonuithread(new runnable() { @override public void run() { log.i("tabsessionactivity:geoservice","service rafraichi"); refreshcurrentfragment(); } }); } }; /************************** service connection **********************/ serviceconnection connection = new serviceconnection() { @override public void onservicedisconnected(componentname name) { log.i("geoservice", "tabssessionactivity:disconnected!"); mgeoservice = null; } @override public void onserviceconnected(componentname name, ibinder service) { // todo auto-generated method stub log.i("tabsessionactivity:geoservice", "tabssessionactivity:connected!"); mgeoservice = ((geolocatingservice.localbinder) service).getservice(); mgeoservice.addlistener(servicelistener); log.i("tabsessionactivity:geoservice","service connecté"); refreshcurrentfragment(); } }; public geolocatingservice getgeolocatingservice() { return mgeoservice; } @suppresswarnings("unchecked") @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // set view main_fragment.xml setcontentview(r.layout.activity_tabs_session); // création de la liste de fragments que fera défiler le pageradapter list fragments = new vector(); // ajout des fragments dans la liste fragments.add(fragment.instantiate(this,osmmapfragment.class.getname())); fragments.add(fragment.instantiate(this,dashboard_fragment.class.getname())); fragments.add(fragment.instantiate(this,fragment1.class.getname())); // création de l'adapter qui s'occupera de l'affichage de la liste de // fragments this.mpageradapter = new mypageradapter(super.getsupportfragmentmanager(),fragments); // affectation de l'adapter au viewpager mviewpager = (viewpager) findviewbyid(r.id.pager); mviewpager.setadapter(this.mpageradapter); //bind title indicator adapter linepageindicator lineindicator = (linepageindicator)findviewbyid(r.id.indicator); lineindicator.setviewpager(mviewpager); //style line indicator final float density = getresources().getdisplaymetrics().density; lineindicator.setselectedcolor(0xff45a5d7); lineindicator.setunselectedcolor(0xff888888); lineindicator.setstrokewidth(4 * density); lineindicator.setlinewidth(30 * density); mviewpager.setcurrentitem(1); log.i("tabsessionactivity:geoservice","on create"); } public void refreshcurrentfragment(){ //retrieve fragments instances fragment1 = (dashboard_fragment) this.mpageradapter.getactivefragment(mviewpager, 1); fragment2 = (osmmapfragment) this.mpageradapter.getactivefragment(mviewpager, 0); fragment3 = (fragment1)this.mpageradapter.getactivefragment(mviewpager, 2); //check if fragment active , visible if (fragment1!=null){ log.i("tabsessionactivity:geoservice","fragment trouvé"); fragment1.ondatachangedcallback(); } if (fragment2!=null){ fragment2.ondatachangedcallback(); } if (fragment3!=null){ fragment3.ondatachangedcallback(); } } @override public void onstart() { super.onstart(); //on attache la vue au service bindservice( new intent(this, geolocatingservice.class), connection, bind_auto_create); log.i("tabsessionactivity:geoservice","on start bind"); } @override public void onresume() { super.onresume(); if(mgeoservice!=null){ log.i("tabsessionactivity:geoservice","refreshcurrentfragment()"); } } @override public void onpause() { super.onpause(); if(mgeoservice!=null){ unbindservice(connection); mgeoservice.removelistener(servicelistener); mgeoservice=null; log.i("tabsessionactivity:geoservice","on pause unbind"); } } @override public void ondestroy() { if(mgeoservice!=null){ unbindservice(connection); log.i("tabsessionactivity:geoservice","on destroy unbind"); } /*if(servicetools.isgeolocatingservicerunning(this)){ stopservice(new intent(this, geolocatingservice.class)); }*/ super.ondestroy(); } @override public boolean onkeydown(int keycode, keyevent event) { if (keycode == keyevent.keycode_back) { if(mgeoservice!=null){ if(mgeoservice.getrecord()){ showcancelrecordalerttouser(); }else{ startactivity(new intent(this, mainactivity.class)); finish(); } }else{ startactivity(new intent(this, mainactivity.class)); finish(); } } return super.onkeydown(keycode, event); }
log cat says null fragments when go on host activity activity b :
fragment1 = (dashboard_fragment) this.mpageradapter.getactivefragment(mviewpager, 1); fragment2 = (osmmapfragment) this.mpageradapter.getactivefragment(mviewpager, 0); fragment3 = (fragment1)this.mpageradapter.getactivefragment(mviewpager, 2);
try this:
onuserinteraction(){ super.onuserinteraction(); switch (mviewpager.getcurrentitem()) { case 3: fragment currentfragment = this.getsupportfragmentmanager() `.findfragmentbytag(getfragmenttag(mviewpager.getcurrentitem())); break; } private string getfragmenttag(int pos) { return "android:switcher:" + r.id.viewpager + ":" + pos; }
log currentfragment value , check whether null. worked me.
Comments
Post a Comment