Search code examples
androidandroid-fragmentsandroid-tablayout

Fragment duplicate tab Layout


i have fragment which have three tabs in, after i came back to HomeFragment from another activity it's same i have duplicate layout

please inform me if I'm doing something wrong ?

enter image description here

HomeFragment.class

    public class HomeFragment extends Fragment {

   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


    }
    public View onCreateView(LayoutInflater inflater , ViewGroup container ,
                                 Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.fragment_home,container,false);

            // [Start Tabs]
            Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar_fragment);
            //toolbar.setNavigationIcon(android.R.drawable.ic_menu_preferences);


            ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);

            ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

            ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

            viewPager = (ViewPager) rootView.findViewById(R.id.fragmetn_viewpager);

            setupViewPager(viewPager);

            tabLayout = (TabLayout) rootView.findViewById(R.id.tabs_fragment);
            tabLayout.setupWithViewPager(viewPager);
            //[*End Tab ]

            return rootView;
        }


        private void setupViewPager(ViewPager viewPager){
            ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
            adapter.notifyDataSetChanged();
            adapter.addFragment(new Tab1Fragment() , "Tab1");
            adapter.addFragment(new Tab2Fragment() , "Tab2");
            adapter.addFragment(new Tab3Fragment() , "Tab3");
            viewPager.setAdapter(adapter);
        }
    }

Solution

  • Try something as:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="wrap_content">
    
    
        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            app:tabGravity="fill"
            app:tabMode="scrollable"
            android:background="@color/material_blue_grey_800"
            app:tabIndicatorColor="@color/orange"
            app:tabSelectedTextColor="@color/orange"
            app:tabTextColor="@color/white"
            android:layout_width="match_parent"
            android:singleLine="true"
            android:layout_height="wrap_content">
    
        </android.support.design.widget.TabLayout>
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </android.support.v4.view.ViewPager>
    
    </LinearLayout>
    

    And:

    public class TabFragment extends Fragment {
    
        public TabLayout tabLayout;
        public ViewPager viewPager;
    
        private static int currentItem = 0;
        MyAdapter adapter;
    
        public static TabFragment newInstance(int someInt) {
            TabFragment frag = new TabFragment();
            Bundle args = new Bundle();
            args.putInt("tab", someInt);
            frag.setArguments(args);
            return frag;
        }
    
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putInt("currentItem", viewPager.getCurrentItem());
        }
    
        public static TabFragment newInstance() {
            TabFragment frag = new TabFragment();
    
            return frag;
        }
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            adapter=new MyAdapter(getChildFragmentManager());
            currentItem=getArguments() != null ? getArguments().getInt("tab") : 0;
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            /**
             *Inflate tab_layout and setup Views.
             */
                View x =  inflater.inflate(R.layout.tab_layout,null);
                tabLayout = (TabLayout) x.findViewById(R.id.tabs);
                viewPager = (ViewPager) x.findViewById(R.id.viewpager);
    
            /**
             *Set an Adapter for the View Pager
             */
            if (adapter==null) adapter=new MyAdapter(getChildFragmentManager());
            viewPager.setAdapter(adapter);
            viewPager.setCurrentItem( currentItem);
    
            /**
             * Now , this is a workaround ,
             * The setupWithViewPager doesn't work without the Runnable .
             * Maybe a Support Library Bug .
             */
    
            tabLayout.post(new Runnable() {
                @Override
                public void run() {
                        tabLayout.setupWithViewPager(viewPager);
                       }
            });
    
            return x;
    
        }
    
    class MyAdapter extends FragmentPagerAdapter {
    
            public MyAdapter(FragmentManager fm) {
                super(fm);
            }
    
            /**
             * Return fragment with respect to Position .
             */
    
            @Override
            public Fragment getItem(int position)
            {
              switch (position){
                  case 0 : return new Tab1Fragment();
                  case 1 : return new Tab2Fragment();
                  case 2 : return new Tab3Fragment();
              }
            return null;
            }
    
            @Override
            public int getCount() {
                return 3;
            }
    
    
            @Override
            public CharSequence getPageTitle(int position) {
    
                switch (position){
                    case 0 :
                        return "Tab1";
                    case 1 :
                        return "Tab2";
                    case 2 :
                        return "Tab3";
                }
                    return null;
            }
        }