禁用在标签页之间滑动的功能

52
我设置了带有两个Fragment的滑动标签,每个Fragment都有一个Button,可以进入WebView。问题是,当点击WebViewButton时,滑动选项卡仍然处于激活状态,当用户尝试在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;
}

我非常确定你正在使用的库中有这样的功能,但问题是如何或者更准确地说是何时重新启用它... - Selvin
@Selvin 是的,我也这么想。我正在使用neokree的MaterialTabs,但是我找不到任何禁用滑动选项卡的方法。这是链接 https://github.com/neokree/MaterialTabs - Darragh O'Flaherty
不要使用MaterialTab,而是创建一个继承该类的自定义类,并覆盖onTouch(...)方法,像这样:bool onTouch(params) {if(someFlagThatMeansThatSlidingIsDissable) { return false; } return super.onTouch(params)} 为此添加一些getter和setter来控制这个标志...然后使用setter来禁用/启用滑动...听起来很容易(但当然我不会为你编写代码-因为它几乎已经在这个评论中写好了)...编辑:正如我之前所写的,问题是什么时候再次启用它? - Selvin
https://dev59.com/z-o6XIcBkEYKwwoYPR7f - Apurva
5个回答

87
实际上,这个答案可以适用于任何ViewPager,无论您使用什么库来实现选项卡,甚至是没有选项卡的普通ViewPager。您正在使用的库neokree/MaterialTabs支持由ViewPager负责滑动效果,并且您可以通过使用新的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)
    }
}

这个类提供了一个可滑动的ViewPager,你可以通过 viewPager.isPagingEnabled = false 关闭它的滑动功能。

另外,你需要将 XML 布局更改为你的新自定义 ViewPager,而不是原始的布局。

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

<my.package.CustomViewPager 
   ...
   />

1
非常感谢您的出色回答,只有一个问题,我不太确定如何在主活动中设置适配器?我有ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 我应该将其更改为什么? - Darragh O'Flaherty
1
你不应该改变那个。 - Ahmed Hegazy
有什么需要我更改的吗? - Darragh O'Flaherty
4
你需要将xml布局更改为你的新自定义ViewPager而不是原始的ViewPager。然后像往常一样获取变量,但在CustomViewPager对象中而不仅仅是ViewPager对象,然后在需要时调用mViewPager.setPagingEnabled(false); - Ahmed Hegazy
抱歉回复晚了,非常好的答案,我花了一些时间才理解。谢谢! - Darragh O'Flaherty
很好,但是选项卡的点击也应该被禁用。 - JosephM

27

Kotlin:

使用ViewPager2……

viewPager.isUserInputEnabled = false

禁用了在选项卡之间滑动的功能,用户仍然可以点击顶部选项卡来切换选项卡。

isUserInputEnabled的文档


4
最实际和清晰的解决方案,谢谢! - Bogdan Stolyarov

2

1

你可以使用这段代码。

viewpager2.setUserInputEnabled(false);

请记住,Stack Overflow 不仅旨在解决当前的问题,还要帮助未来的读者找到类似问题的解决方案,这需要理解底层代码。对于我们社区中的初学者和不熟悉语法的成员来说,这尤其重要。鉴于此,您能否编辑您的答案,包括您正在做什么以及为什么您认为这是最好的方法的解释 - Jeremy Caney
请阅读如何撰写好的答案?。虽然这个代码块可能回答了OP的问题,但如果您解释一下这段代码与问题中的代码有何不同,您做了哪些更改,为什么要更改以及为什么这样解决问题而不会引入其他问题,那么这个答案将会更加有用。 - Saeed Zhiany

1

已接受答案的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 ...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接