簡體   English   中英

如何禁用 ViewPager2 中的滑動?

[英]How to disable swiping in ViewPager2?

是否可以在新的 android viewpager2組件中啟用/禁用滑動?

現在可以使用Version 1.0.0-alpha02啟用/禁用滑動viewpager2

使用implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha02'

版本 1.0.0

新功能

  • 能夠禁用用戶輸入( setUserInputEnabledisUserInputEnabled

API 更改

  • ViewPager2類最終

Bug修復

  • FragmentStateAdapter穩定性修復

在 viewpager2 中禁用滑動的示例代碼

myViewPager2.setUserInputEnabled(false);

在 viewpager2 中啟用滑動的示例代碼

myViewPager2.setUserInputEnabled(true);

在引擎蓋下ViewPager2RecyclerView ViewPager2工作以膨脹片段視圖,但RecyclerView是隱藏的,因此它們使它更白痴證明。

 val rv : RecyclerView = viewPager.getChildAt(0) as RecyclerView
 rv.layoutManager = NonScrollingLayoutManager( rv.context, rv.layoutManager as LinearLayoutManager)

hacky 方法是通過包裝布局管理器將子RecyclerView置於零位置,即RecyclerView並禁用布局管理器中的滾動:

inner class NonScrollingLayoutManager(context: Context, val layoutManager: LinearLayoutManager) :
    LinearLayoutManager(context, layoutManager.orientation, layoutManager.reverseLayout) {

    override fun canScrollVertically(): Boolean  = layoutManager.orientation == HORIZONTAL


    override fun canScrollHorizontally(): Boolean  =  layoutManager.orientation == VERTICAL

}

請注意,如果 API 更改了用於 RecyclerView 的布局管理器,即它們從LinearLayoutManager移開,這將不起作用,它將需要覆蓋一些方法並確保調用超級方法。

第二種方法是將ViewPager2子類化,它是ViewGroup ,然后在將觸摸事件分派到子視圖之前(如您所猜測的RecyclerView )在攔截觸摸事件中發揮魔力,並注意不要阻止點擊。

如果您使用的是 Android 數據綁定,您可以簡單地禁用它您的布局 xml 文件。

app:userInputEnabled="@{false}"
viewPager2.setUserInputEnabled(false);

是的,有可能。

mViewPager2.setUserInputEnabled(false); //禁用滑動

mViewPager2.setUserInputEnabled(true); //啟用滑動

我們可以基於選項卡禁用和啟用,如下代碼所示

ViewPager2 mViewPager2 = findViewById(R.id.view_pager);
        mViewPager2.setOffscreenPageLimit(adapter.getItemCount() - 1);
        mViewPager2.setAdapter(adapter); 


        TabLayout tabLayout  = findViewById(R.id.sliding_tabs);
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                //do stuff here
                if(tab.getPosition() == 0){
                    **//ToDisable**
                    mViewPager2.setUserInputEnabled(false);
                }else{
                    **//ToEnable**
                    mViewPager2.setUserInputEnabled(true);
                }

            }

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

            }

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

            }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM