android - ViewPager - In the fragment pages create a new fragment -
i have viewpager activity. viewpager has tablayout 3 tabs: fragmenta, fragmentb, , fragmentc, each corresponding 1 of 3 pages shown in viewpager. inside of fragmentb though have button. need able click button , have new fragment created, fragmentd, overtake fragmentb. new fragment needs have action bar arrow can go fragmentb. tabs should still show fragmentb active tab during of this. have looked nested fragments, not make work. have tried creating reference viewpager acitivty fragment , calling getitem method position of new fragment doesn't work. code right now. activity, creates viewpager. inside of viewpager3 fragments created , tablayoutis created:
public class myactivity extends appcompatactivity { viewpager viewpager; pageradapter pageradapter; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_my); // viewpager , set it's pageradapter can display items viewpager = (viewpager) findviewbyid(r.id.viewpager); pageradapter = new pageradapter(getsupportfragmentmanager(), myactivity.this); viewpager.setadapter(pageradapter); viewpager.setoffscreenpagelimit(3); // give tablayout viewpager tablayout tablayout = (tablayout) findviewbyid(r.id.tab_layout); tablayout.setupwithviewpager(viewpager); // iterate on tabs , set custom view (int = 0; < tablayout.gettabcount(); i++) { tablayout.tab tab = tablayout.gettabat(i); tab.setcustomview(pageradapter.gettabview(i)); } } class pageradapter extends fragmentpageradapter { string tabtitles[] = new string[] { "fragmenta", "fragmentb", "fragmentc", }; public fragment[] fragments = new fragment[tabtitles.length]; context context; public pageradapter(fragmentmanager fm, context context) { super(fm); this.context = context; } @override public int getcount() { return tabtitles.length; } @override public fragment getitem(int position) { switch (position) { case 0: return new myfragmenta(); case 1: return new myfragmentb(); //inside of fragment b have button. if button clicked fragment needs replaced new fragment temporarliy, fragmentd, have anctionbar able go fragment b. tabs should show user technically still in fragmentb tab. case 2: return new myfragmentc(); } return null; } @override public charsequence getpagetitle(int position) { // generate title based on item position return tabtitles[position]; } public view gettabview(int position) { view tab = layoutinflater.from(myactivity.this).inflate(r.layout.custom_tab, null); textview tv = (textview) tab.findviewbyid(r.id.custom_text); tv.settext(tabtitles[position]); return tab; } //this populates fragment reference array: @override public object instantiateitem(viewgroup container, int position) { fragment createdfragment = (fragment) super.instantiateitem(container, position); fragments[position] = createdfragment; return createdfragment; } } }
i assume there purpose of this?
public fragment[] fragments = new fragment[tabtitles.length]; you assign it, never use elements.
you use lazily create fragments
@override public fragment getitem(int position) { fragment f = fragments[position]; if (f == null) { switch (position) { case 0: f = new myfragmenta(); break; case 1: f = new myfragmentb(); break; case 2: f = new myfragmentc(); break; } fragments[position] = f; } return f; } or looking here, not implemented correctly since super.instantiateitem(container, position) never creating of 3 fragment classes want.
@override public object instantiateitem(viewgroup container, int position) { fragment createdfragment = (fragment) super.instantiateitem(container, position); fragments[position] = createdfragment; return createdfragment; } so, remove method here
inside of fragmentb though have button. need able click button , have new fragment created, fragmentd, overtake fragmentb... tabs should still show fragmentb active tab during of this.
you need callback fragmentb activity
how implement onfragmentinteractionlistener
then, in activity callback, create , can possibly "replace page 2" of viewpager.
this new fragment needs have action bar arrow can go fragmentb.
you need second method in interface onbackpressed re-create , load fragmentb on fragmentd in viewpager
Comments
Post a Comment