让 viewpager2 响应标签点击事件

Posted

技术标签:

【中文标题】让 viewpager2 响应标签点击事件【英文标题】:Making viewpager2 respond to tab click events 【发布时间】:2020-10-07 19:42:03 【问题描述】:

我目前使用 TabLayoutMediator 设置了带有 tablayout 的 viewpager2。选项卡布局与滑动手势完美配合,但我也希望选项卡响应直接点击事件。这是我的代码:

Activity 的 OnCreate:

        viewPager = accessBinding.pager;
        pagerAdapter = new ScreenSlidePagerAdapter(this);
        viewPager.setAdapter(pagerAdapter);
        accessBinding.setLifecycleOwner(this);

        TabLayout tabLayout = accessBinding.accessTabs;
        TabLayout dotTabs = accessBinding.tabsDots;

        new TabLayoutMediator(tabLayout, viewPager,
                (tab, position) -> tab.setText(TAB_TITLES[position])
        ).attach();

        new TabLayoutMediator(dotTabs, viewPager,
                (tab, position) -> 
        ).attach();

ScreenSlidePagerAdapter.java

private static class ScreenSlidePagerAdapter extends FragmentStateAdapter 
        // The number of tabs.
        private final int NUM_TABS = 2;
        public ScreenSlidePagerAdapter(FragmentActivity fa) 
            super(fa);
        

        @Override
        public Fragment createFragment(int position) 
            Log.d("lifecycle","viewpager createFragment");
            if(position==0)
                return new LoginFragment();
            else
                return new RegisterFragment();
        

        @Override
        public int getItemCount() 
            return NUM_TABS;
        
    

布局文件:

<androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/accesslayout"
        android:layout_
        android:layout_
        app:layout_constraintVertical_weight="0">

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/topguideline"
            android:layout_
            android:layout_
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.25" />

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/access_tabs"
            android:layout_
            android:layout_
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/topguideline"
            app:tabGravity="fill" />

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabs_dots"
            android:layout_
            android:layout_
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/pager"
            app:tabBackground="@drawable/tab_selector"
            app:tabPadding="0dp"
            app:tabGravity="center"
            app:tabIndicatorHeight="0dp"
            app:tabIndicatorFullWidth="false"/>

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/pager"
            android:layout_
            android:layout_
            android:layout_marginBottom="50dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@id/topguideline" />
</androidx.constraintlayout.widget.ConstraintLayout>

我尝试过使用

tabLayout.addOnTabSelectedListener(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) 

            
        );

但它不起作用。请帮我解决这个问题。我认为 tabselected 的 viewPager 实现覆盖了我的实现,但我需要弄清楚如何让 viewpager 也响应点击事件

【问题讨论】:

【参考方案1】:

帮助我的是将父布局从 ConstraintLayout 更改为 LinearLayout。这是帮助我解决此问题的帖子: Android : TabLayout not responding to clicks

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考

以上是关于让 viewpager2 响应标签点击事件的主要内容,如果未能解决你的问题,请参考以下文章

js 怎样使div无法响应点击事件

响应Activity中的ViewPager2 Fragments事件

qt中当鼠标点击子窗口时如何让父窗口响应鼠标点击事件?

让超出父视图范围的子视图响应事件,在UIView范围外响应点击

v-on事件修饰符

js如何阻止onclick点击事件响应两次