2 votes

Changer les onglets dans TabLayout par le code, avec un obstacle

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 ?

1voto

MeLine Points 399

Vous pouvez obtenir FAQFragment , ChatFragment o SettingsFragment à partir de ViewPager comme décrit aquí . Une fois que vous avez obtenu les Fragment vous pouvez manipuler tout ce que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X