【问题标题】:Disable swiping between tabs禁用标签之间的滑动
【发布时间】:2015-04-14 17:32:43
【问题描述】:

我设置了带有两个Fragments 的滑动标签,每个Fragment 有一个Button,它转到WebView。问题在于,当单击 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;
}

【问题讨论】:

  • 我很确定在您使用的任何库中都有这样的功能,但问题是如何或何时再次启用它...
  • @Selvin 是的,我以为我自己正在使用 neokree 的 MaterialTabs,但我找不到任何方法来禁用滑动标签。这是链接github.com/neokree/MaterialTabs
  • 好的,而是使用 MaterialTab 创建自己的类,该类扩展此类并覆盖 onTouch(...) 像这样 bool onTouch(params) {if(someFlagThatMeansThatSlidingIsDissable) { return false; } return super.onTouch(params)} 为这个标志添加一些 getter 和 setter ...然后使用 setter 来禁用/启用滑动....听起来很容易(但我当然不会为您编写代码 - 好吧,因为它几乎写在此评论中)...编辑:正如我之前写的,问题是何时再次启用它?

标签: android android-fragments android-tabs


【解决方案1】:

这个答案实际上可以应用于任何 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 
   ...
   />

【讨论】:

  • 很好的答案非常感谢只是一个问题我不确定如何在主活动中设置适配器?我有ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 我应该把它改成什么?
  • 你不应该改变它。
  • 有什么我应该改变的吗?
  • 您必须将 xml 布局更改为新的自定义 ViewPager 而不是原来的。然后像往常一样在 CustomViewPager 对象中获取变量,而不仅仅是 ViewPager obj,然后在需要时调用mViewPager.setPagingEnabled(false);
  • 很抱歉回复晚了,我花了一段时间才弄清楚。谢谢!
【解决方案2】:

科特林:

使用 ViewPager2...

viewPager.isUserInputEnabled = false

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

Documentation on isUserInputEnabled

【讨论】:

  • 最实际最清晰的解决方案,谢谢!
【解决方案3】:

最简单的方法是setOnTouchListener 并为ViewPager 返回true

原答案: https://stackoverflow.com/a/13392198/4293813

【讨论】:

    【解决方案4】:

    Accepted Answer 的 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 位置进行修改,即:

    &lt;your.packg.name.CustomViewPager ...

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多