Android 禁止在选项卡之间滑动

Android 禁止在选项卡之间滑动,android,android-fragments,android-tabs,Android,Android Fragments,Android Tabs,我用两个Fragments设置了滑动选项卡,每个Fragment都有一个按钮,该按钮指向WebView。问题是,当单击WebView按钮时,滑动选项卡仍处于激活状态,当用户尝试在WebView中导航时,您最终会滑动到另一个选项卡。点击方法中是否有办法禁用选项卡的滑动功能?任何帮助都将不胜感激 代码如下: public class MyWebViewClass extends Fragment { private WebView mWebView; private Button mButton;

我用两个
Fragment
s设置了滑动选项卡,每个
Fragment
都有一个
按钮,该按钮指向
WebView
。问题是,当单击
WebView
按钮时,滑动选项卡仍处于激活状态,当用户尝试在
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。

您正在使用的库由一个负责滑动效果的ViewPager支持,您可以通过使用新的或提供自己的自定义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)
    }
}
此类提供了一个已启用滑动的ViewPager,您可以通过
ViewPager.isPaginEnabled=false将其关闭

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

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


最简单的方法是
设置TouchListener
并为
ViewPager
返回
true

原始答复:

接受答案的AndroidX和Kotlin版本: 始终禁用分页的ViewPager
带分页功能的ViewPager可随时打开或关闭。
最后,在XML文件中找到ViewPager行,并根据您的CustomViewPager位置进行修改,即:

科特林:

正在使用ViewPager2

viewPager.isUserInputEnabled = false
在选项卡之间滑动被禁用,用户仍然可以点击顶部的选项卡在选项卡之间移动


我很确定,无论您使用的是什么LIB,都有这样的功能,但问题是如何或更确切地说什么时候再次启用它…@Selvin是的,我自己认为,我正在使用neokree的MaterialTables,但我找不到任何方法禁用滑动选项卡。这里的链接是ok,而不是使用MaterialTab创建您自己的类,该类扩展了这个类并覆盖了onTouch(…),如下所示
bool-onTouch(params){if(someFlag意味着滑动是可访问的){return false;}return super.onTouch(params)}
为这个标志添加一些getter和setter。。。然后使用setter禁用/启用滑动。。。。听起来很简单(但我当然不会为您编写代码——因为在这篇评论中它几乎已经写好了)。。。编辑:正如我之前写的,问题是什么时候再次启用它?非常好的答案非常感谢只有一个问题我不太确定如何在主活动中设置适配器?我有
ViewPagerAdapter适配器=新的ViewPagerAdapter(getSupportFragmentManager())我应该将此更改为什么?您不应该更改。有什么我应该更改的吗?您必须将xml布局更改为新的自定义ViewPager,而不是原始的。然后像always一样获取变量,但在CustomViewPager对象中,而不仅仅是ViewPager对象中,然后调用
mViewPager.setPaginEnabled(false)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
    }
}
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)
    }
}
viewPager.isUserInputEnabled = false