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
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. –
Wenn Sie die fab auf Blättern verstecken Sie ein Layout mit Struktur ähnlich wie diese schaffen FrameLayout> nicht zu 100% sicher, aber Ich denke, es sollte funktionieren –