禁用选项卡之间的滑动

Disable swiping between tabs

我设置了带有两个 Fragment 的滑动选项卡,每个 Fragment 都有一个 ButtonWebView。这个问题是当 WebView Button 被点击时,滑动标签仍然被激活,当用户试图在 WebView 中导航时,你最终滑动到另一个标签。单击方法中是否有一种方法可以禁用选项卡的滑动功能?任何帮助将不胜感激!

这里是代码:

public class MyWebViewClass extends Fragment {

private WebView mWebView;
private Button mButton;

public MyWebViewClass() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_webview, container, false);

    mWebView = (WebView) view.findViewById(R.id.WebView);

    mButton = (Button) view.findViewById(R.id.Button1);
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mWebView.setVisibility(View.VISIBLE);
            mButton.setVisibility(View.GONE);
            mWebView.getSettings().setJavaScriptEnabled(true);
            mWebView.loadUrl("www.google.com");
        }
    });

    return view;
}

这个答案实际上可以应用于任何 ViewPager,无论您用来实现选项卡的库是什么,甚至是没有选项卡的普通 ViewPager。

您正在使用的库 neokree/MaterialTabs is backed with a ViewPager that is responsible for the swiping effect and you can disable that by using the new ViewPager2 或提供您自己的自定义 ViewPager。

import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager

class CustomViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) {

    var isPagingEnabled: Boolean = true

    @SuppressLint("ClickableViewAccessibility")
    override fun onTouchEvent(event: MotionEvent): Boolean {
        return isPagingEnabled && super.onTouchEvent(event)
    }

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        return isPagingEnabled && super.onInterceptTouchEvent(event)
    }
}

此 class 提供了一个启用滑动的 ViewPager,您可以通过 viewPager.isPagingEnabled = false

将其关闭

更不用说您必须将 XML 布局更改为新的自定义 ViewPager 而不是原始布局。

<androidx.viewpager.widget.ViewPager 
   ...
   />

<my.package.CustomViewPager 
   ...
   />

最简单的方法是 setOnTouchListener 和 return true for ViewPager.

原答案:

已接受的答案的 AndroidX 和 Kotlin 版本:

一直禁用分页的 ViewPager

package your.packg.name //CustomViewPager's location actually

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager

class CustomViewPager(
    context: Context?,
    attrs: AttributeSet?
) :
    ViewPager(context!!, attrs) {
    override fun onTouchEvent(event: MotionEvent): Boolean {
        return false
    }

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        return false
    }
}

可随时打开或关闭分页的 ViewPager。

package your.packg.name //CustomViewPager's location actually

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager

class CustomViewPager(
    context: Context?,
    attrs: AttributeSet?
) :
    ViewPager(context!!, attrs) {
    var isPagingEnabled = false   //Modify this in code for switch

    override fun onTouchEvent(event: MotionEvent): Boolean {
        return isPagingEnabled && super.onTouchEvent(event)
    }

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        return isPagingEnabled && super.onInterceptTouchEvent(event)
    }
}

最后,在 XML 文件中找到 ViewPager 行并根据您的 CustomViewPager 位置进行修改,即:

<your.packg.name.CustomViewPager ...

科特林:

使用 ViewPager2...

viewPager.isUserInputEnabled = false

标签之间的滑动被禁用,用户仍然可以点击顶部的标签在标签之间切换。

Documentation on isUserInputEnabled