2017-03-14 11 views
0

Ich habe eine Aktivität mit einem TabLayout mit 2 Tabs, jedes mit einem eigenen Fragment. Es gibt einen Fab-Button in meiner Aktivität. Wenn ich in Tab 1 bin und darauf klicke, möchte ich irgendwie auf die getItem() - Methode des ViewPagerAdapter hinweisen, dass "hey, der Button angeklickt wurde. Bestehendes Fragment in Tab 1 durch ein anderes Fragment ersetzen."Kommunikation zwischen Activity und ViewPagerAdapter über Listener

Ich bin mir nicht sicher, wie das geht. Ich dachte, vielleicht einen Zuhörer hinzuzufügen, aber ich weiß nicht, wie ich es implementieren soll. Jede Hilfe wäre willkommen.

Hauptaktivität:

public class MainActivity extends AppCompatActivity { 
private ViewPager viewPager; 
private ArrayList<Fragment> fragments = new ArrayList<>(); 
private ArrayList<String> titles = new ArrayList<>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout)findViewById(R.id.collapsing_toolbar); 
    setSupportActionBar(toolbar); 

    fragments.addAll(Arrays.asList(new Tasks(),new Calendar(),new Contacts())); 
    titles.addAll(Arrays.asList(getResources().getString(R.string.fragment_task_title), 
      getResources().getString(R.string.fragment_cal_title),getResources().getString(R.string.fragment_contacts_title))); 
    TabLayout tabLayout = (TabLayout)findViewById(R.id.tabs); 

    final FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab); 
    fab.hide(); 

    viewPager = (ViewPager)findViewById(R.id.container); 
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(),fragments,titles); 
    viewPager.setAdapter(viewPagerAdapter); 
    viewPager.setCurrentItem(1); 
    viewPager.addOnPageChangeListener(new 
    tabLayout.setupWithViewPager(viewPager); 

    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      fabAction(); 
     } 
    }); 

    if (savedInstanceState==null){ 
     if (getSupportActionBar()!=null){ 
      getSupportActionBar().setDisplayShowTitleEnabled(true); 
     } 
    } 
} 
public void fabAction(){ 
    int current = viewPager.getCurrentItem(); 

    switch (current){ 
     case 0:{ 
      //TELL THE VIEWPAGER ADAPTER THAT BUTTON IS CLICKED AND SWITCH FRAGMENTS 
      break; 
     } 
     case 1:{ 
      Toast.makeText(this, "IN TAB 2", Toast.LENGTH_LONG).show(); 
      break; 
     } 
    } 
}} 

ViewPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter{ 
ArrayList<Fragment> fragments; 
ArrayList<String> titles; 
private Fragment mFragmentAtPos0; 
private FragmentManager fragManager; 

//NEED TO IMPLEMENT THE LISTENER IN THIS CLASS TELLING ME THAT THE BUTTON WAS CLICKED IN MAIN ACTIVITY 
public ViewPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments, ArrayList<String>titles) { 
    super(fm); 
    this.fragments = fragments; 
    this.titles = titles; 
    fragManager = fm; 

} 

@Override 
public Fragment getItem(int position) { 
    //Somehow get Indication Here that the button was clicked 

    if (position == 0) 
    { 
     if(mFragmentAtPos0==null){ 
      mFragmentAtPos0 = new Tasks(); 
      fragManager.beginTransaction().replace(R.id.container,mFragmentAtPos0).commit(); 
      notifyDataSetChanged(); 
     } 
     return mFragmentAtPos0; 
    }else{ 
     return fragments.get(position); 

    } 

} 

@Override 
public int getCount() { 
    return fragments.size(); 
} 

@Override 
public CharSequence getPageTitle(int position) { 

    return titles.get(position); 
} 

@Override 
public int getItemPosition(Object object) 
{ 
    if (object instanceof Tasks && mFragmentAtPos0 instanceof AddContact) 
     return POSITION_NONE; 
    return POSITION_UNCHANGED; 
}} 

Dies ist, was ich bin versucht, auftreten und bekam meine Idee von @ wize Antwort auf ein ähnliches Problem. Es gibt zu viele fehlende Teile in der Antwort für mich, um die Gesamtheit der Lösung zu begreifen: Replace Fragment Inside ViewPager

Antwort

1

Dies ist in der Tat ein bisschen schwierig zu tun. Vielleicht sollten Sie in Erwägung ziehen, Ihre Fab auf das Fragment zu verschieben, das Sie ändern möchten, und die Änderungen innerhalb des Fragments zu bearbeiten. Wenn fab in Activity sein muss, können Sie Fragmente vom Pager Adapter selbst hinzufügen/entfernen.

Adapter sollte wie folgt aussehen:

public class CodebaseFragmentPagerAdapter extends FragmentStatePagerAdapter { 

    private List<Fragment> mFragmentList = new ArrayList<Fragment>(); 

    public CodebaseFragmentPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    public void removeItem(int position){ 
     mFragmentList.remove(position == 0 ? 0 : position - 1); 
     this.notifyDataSetChanged(); 
    } 

    public void clearAllItems(){ 
     mFragmentList.clear(); 
     this.notifyDataSetChanged(); 
    } 

    public void updateItem(int position, Fragment fragment){ 
     mFragmentList.set(position, fragment); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     if (mFragmentList.contains(object)) return mFragmentList.indexOf(object); 
     else return POSITION_NONE; 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFrag(Fragment fragment) { 
     mFragmentList.add(fragment); 
     notifyDataSetChanged(); 
    } 
} 

Hinweis: Über Adapter keine Unterstützung für Registerlayouts hat, so fühlen sich frei, um es anzupassen Ihre Bedürfnisse

Verwendung zu passen:

mAdapter = new CodebaseFragmentPagerAdapter(getSupportFragmentManager()); 
mViewPager.setAdapter(mAdapter); 

mAdapter.addFrag(FragmentExample.newInstance()); 
+0

Das ist ein guter Vorschlag. Der Grund, warum ich die Fab in der MainActivity belassen habe, ist, weil ich eine kollabierende Toolbar habe, die die Fab versteckt, wenn sie in der unteren rechten Ecke eines Fragments platziert wird. Ich werde stattdessen versuchen, mit diesem Layout zu spielen. –

+0

Wenn Sie die fab auf Blättern verstecken Sie ein Layout mit Struktur ähnlich wie diese schaffen nicht zu 100% sicher, aber Ich denke, es sollte funktionieren –

Verwandte Themen