L'idée est que j'ai un auditeur FAQFragment.OnQuestionSelectedListener
qui est attachée à l'activité principale qui détient un TabLayout
. Maintenant, je veux que chaque fois que je reçois l'événement, je transmette les arguments de l'événement à l'un des fragments de la TabLayout. Voici mon code jusqu'à présent :
public class MainActivity extends AppCompatActivity implements FAQFragment.OnQuestionSelectedListener{
private SectionsPagerAdapter sectionsPagerAdapter;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
public void onQuestionSelected(String question) {
sectionsPagerAdapter.setFaq(question);
sectionsPagerAdapter.notifyDataSetChanged();
selectPage(1);
}
private void selectPage(int pageIndex) {
tabLayout.setScrollPosition(pageIndex,0f,true);
viewPager.setCurrentItem(pageIndex);
}
public class SectionsPagerAdapter extends FragmentPagerAdapter{
private String faq;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
faq = null;
}
public void setFaq(String faq) {
this.faq = faq;
}
@Override
public Fragment getItem(int position) {
if (position == 0) return FAQFragment.newInstance();
else if (position == 1) {
ChatFragment chatFragment = ChatFragment.newInstance(faq);
faq = null;
return chatFragment;
}
else if (position == 2) return SettingsFragment.newInstance();
return null;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0: return "FAQ";
case 1: return "Morty";
case 2: return "Settings";
default: return null;
}
}
@Override
public int getCount() {
return 3;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupTabLayout();
}
private void setupTabLayout() {
// adapter
sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// viewpager
viewPager = findViewById(R.id.container);
viewPager.setAdapter(sectionsPagerAdapter);
// tablayout
tabLayout = findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
// load chat initially
viewPager.setCurrentItem(1);
// listeners
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));
}
}
Le problème de ce code est qu'il ne passe pas par la fonction FragmentPagerAdapter
's getItemMethods()
lorsque les onglets sont intervertis dans le code. Je sais que je pourrais le faire en utilisant fragmentManager() pour échanger les fragments lorsque je reçois l'événement, mais lorsque j'ai fait cela, la transition n'était pas fluide (il y a un petit scintillement qui me fait grincer des dents). Existe-t-il un moyen d'implémenter une logique similaire qui passerait une nouvelle instance de fragment à chaque fois qu'un onglet est sélectionné par le biais de viewPager.setCurrentItem
o tabLayout.getItem(1).select
?