Search code examples
androidandroid-tablayoutandroid-tabsfragmentpageradapter

i have a dynamic tablayout but every time i push back button and re-enter my app again , my tab doubles , why?


in my TabLayout i create my login TabItem dynamically at the onCreate() method of my MainActivity , but every time i exit from my application with back button and i re-enter my app , it creates that login TabItem again and so it doubles it every time , i tried to check and use :

if(savedInstanceState == null) {
   // create the first tab
}

but it didn't work , can you please help me ? here is my code for the MainActivity :

public class MainActivity extends AppCompatActivity {


    TabLayout tabLayout;
    ViewPager viewPager;
    public static List<Fragment> fragments = new ArrayList<>();
    public static List<String> fragmentsTitle = new ArrayList<>();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tabLayout = findViewById(R.id.myTabLayout);
        viewPager = findViewById(R.id.myViewPager);
        MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
        Adapter.createTab(new LoginFragment(), "Login", getSupportFragmentManager(), viewPager);
        viewPager.setAdapter(Adapter);
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

            public void onTabSelected(TabLayout.Tab tab) {

            }

            public void onTabUnselected(TabLayout.Tab tab) {

            }

            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }
}

and this is the code for FragmentPagerAdapter

public class MyViewPagerAdapter extends FragmentPagerAdapter {

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

    public void createTab(Fragment fragment, String title, FragmentManager manager, ViewPager viewPager) {
        MyViewPagerAdapter Adapter = new MyViewPagerAdapter(manager);
        MainActivity.fragments.add(fragment);
        MainActivity.fragmentsTitle.add(title);
        Adapter.notifyDataSetChanged();
        viewPager.setAdapter(Adapter);
    }

    public Fragment getItem(int position) {
        return MainActivity.fragments.get(position);
    }

    public CharSequence getPageTitle(int position) {
        return MainActivity.fragmentsTitle.get(position);
    }

    public int getCount() {
        return MainActivity.fragments.size();
    }
}

Solution

  • Try removing static keyword from your list in MainActivity. Instead use final to prevent reinitialisation of list. It's creating that tab everytime because static things stay alive as long as they get killed. And the professional way on earth to create tab and store them inside list is to keep that list inside viewpager adaptor. I am happy it was helpful.