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

Popular posts from this blog

How to understand 2 main() functions after using uftrace to profile the C++ program? -

c# - Update a combobox from a presenter (MVP) -

How to put a lock and transaction on table using spring 4 or above using jdbcTemplate and annotations like @Transactional? -