skip to Main Content

I have a tabLayout and a viewPager underneath it. When I click on the tab, it switches tabs perfectly fine. However, when I swipe, the viewPage swipes over, but the tab does not change focus. I have to manually click on the corresponding tab in order to change the focus (viewPager does not change).

For example, if I’m on the 4th slide, and I swipe left, the viewPage goes to the 3rd slide, but the tab isn’t focused over. I have to manually tap on the 3rd tab in order to change the focus.

I’m wondering how I can let the tabs follow the swiping when I swipe from view to view in the viewPager.

fragment XML:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.tabs.TabLayout
        android:layout_height="wrap_content"
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toTopOf="@id/pager"/>

    <androidx.viewpager.widget.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pager"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</androidx.constraintlayout.widget.ConstraintLayout>

PagerFragment:

public class PagerFragment extends Fragment {
   
    ViewPagerAdapter pagerAdapter;

    ViewPager pager;
    TabLayout tl;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        pagerAdapter = new ViewPagerAdapter(this.getContext(), getChildFragmentManager(), 4, getActivity());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View view = super.onCreateView(inflater, container, savedInstanceState);
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_pager, null);
        pager = root.findViewById(R.id.pager);
        pager.setAdapter(pagerAdapter);
        tl = root.findViewById(R.id.tab_layout);
        tl.addTab(tl.newTab().setText("1"));
        tl.addTab(tl.newTab().setText("2"));
        tl.addTab(tl.newTab().setText("3"));
        tl.addTab(tl.newTab().setText("4"));

        tl.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                pager.setCurrentItem(tab.getPosition());
            }

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

            }

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

            }
        });
        tl.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(pager));

        return root;
    }
}

Adapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {

    private Context myContext;
    int totalTabs;

    public ViewPagerAdapter(Context context, FragmentManager fm, int totalTabs, FragmentActivity fa) {
        super(fm);
        myContext = context;
        this.totalTabs = totalTabs;
    }

    public Fragment getItem(int position) {
        graph_test gt = new graph_test(String.valueOf(position), position);
        return gt;
    }

    @Override
    public int getCount() {
        return totalTabs;
    }
}

Note: I know that FragmentPagerAdapter is deprecated. I was asked to do it this way.

Thanks.

2

Answers


  1. Using the androidx.viewpager.widget.ViewPager you have to set also the ViewPager.OnPageChangeListener with TabLayout.TabLayoutOnPageChangeListener like the below:

     pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tl));
    

    By doing the above you should be able to change the Tab focus when swiping the ViewPager left or right.

    Login or Signup to reply.
  2. onViewCreated() use

    TabLayoutMediator(tabLayout, viewPager){ tab, position ->
        // set tab text by given *position*
        tab.text = "Tab_{position}" // for example
    }.atach()
    

    to link TabLayout and ViewPager and atach it

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search