简体   繁体   English

选择特定选项卡上的打开活动

[英]open activity on specific tab selected

I want to implement Tablayout addOnTabSelectedListener to open a new Activity on a certain tab click. 我想实现Tablayout addOnTabSelectedListener以在某个选项卡上单击打开一个新的Activity。 There are 3 tabs and at present they are connected with fragments. 有3个选项卡,目前它们与片段连接。 I want to start an activity when I click position 1 tab. 我想点击位置1标签时启动一个活动。 I can do that in onTabSelected but before opening activity it shows the fragment attached to that same position. 我可以在onTabSelected执行此操作,但在打开活动之前,它会显示附加到同一位置的片段。 How to remove that fragment? 如何删除该片段?

public class MainActivity extends AppCompatActivity {

    private TabLayout tabs;
    private ViewPager viewpager;

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


        tabs = (TabLayout)findViewById(R.id.tabs);
        viewpager = (ViewPager)findViewById(R.id.viewpager);
        setupViewPager(viewpager);


        tabs.addTab(tabs.newTab());
        tabs.addTab(tabs.newTab());
        tabs.addTab(tabs.newTab());

        tabs.setupWithViewPager(viewpager);

        tabs.addOnTabSelectedListener(onTabSelectedListener(viewpager));

    }

    private TabLayout.OnTabSelectedListener onTabSelectedListener(final ViewPager viewPager) {

        return new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        };
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new Frag1(), "ONE");
        adapter.addFragment(new Frag2(), "TWO");
        adapter.addFragment(new Frag3(), "THREE");
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabs));
        onTabSelectedListener(viewPager);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

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

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

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

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }


        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}


    private TabLayout.OnTabSelectedListener onTabSelectedListener(final ViewPager viewPager) {

        return new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        };
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new Frag1(), "ONE");
        adapter.addFragment(new Frag2(), "TWO");
        adapter.addFragment(new Frag3(), "THREE");
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabs));
        onTabSelectedListener(viewPager);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

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

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

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

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }


        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }

}

try this: 尝试这个:

use a FragmentStatePagerAdapter instead the reason for this is that the FragmentPagerAdapter will keep all the views that it loads into memory forever. 使用FragmentStatePagerAdapter ,原因是FragmentPagerAdapter会将它加载的所有视图永久保存到内存中。 Where the FragmentStatePagerAdapter disposes of views that fall outside the current FragmentStatePagerAdapter处理掉当前视图之外的视图

Also Override the adapter method getItemPosition 还覆盖适配器方法getItemPosition

For example: 例如:

    private class ViewPagerAdapter extends FragmentStatePagerAdapter {

    //... your existing code

    @Override
    public int getItemPosition(Object object){
        return PagerAdapter.POSITION_NONE;
    }

}

source 资源

it will recreate your fragment each time instead of loading them from memory first.. 它将每次重新创建您的片段,而不是首先从内存中加载它们。

To start activity do it in your particular fragment's onCreate() 要开始活动,请在特定片段的onCreate()

Hope this helps.. 希望这可以帮助..

I had same requirement, what i did is overlap textview on center of TabLayout using RelativeLayout & apply click event on textview. 我有同样的要求,我做的是使用RelativeLayout重叠TabLayout中心的textview并在textview上应用click事件。 I can not post my layout please refer demo image 我无法发布我的布局请参考演示图片

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM