Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过代码更改TabLayout中的选项卡,只有一个障碍_Android - Fatal编程技术网

Android 通过代码更改TabLayout中的选项卡,只有一个障碍

Android 通过代码更改TabLayout中的选项卡,只有一个障碍,android,Android,我的想法是,我有一个listenerFAQFragment.OnQuestionSelectedListener,它附加到主活动,其中包含一个表格布局。现在,我希望每次收到事件时,都将事件参数传递给TabLayout中的一个片段。这是我目前的代码: public class MainActivity extends AppCompatActivity implements FAQFragment.OnQuestionSelectedListener{ private SectionsP

我的想法是,我有一个listener
FAQFragment.OnQuestionSelectedListener
,它附加到主活动,其中包含一个
表格布局。现在,我希望每次收到事件时,都将事件参数传递给TabLayout中的一个片段。这是我目前的代码:

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));
    }
}

此代码的问题在于,当通过代码交换选项卡时,它不会通过
FragmentPagerAdapter
getItemMethods()
。现在,我知道我可以在收到事件时使用fragmentManager()来交换片段,但是当我这样做时,转换并不顺利(有一个小的闪烁会磨坏我的齿轮)。那么,有没有办法实现一个类似的逻辑,每次通过
viewPager.setCurrentItem
tabLayout.getItem(1)选择选项卡时,都会传递一个新的片段实例。选择

您可以从viewPager获得
FAQFragment
ChatFragment
设置片段
。一旦获得了所需的
片段
,您就可以随心所欲地进行操作