如何禁用PagerTabStrip的Tab单击事件

bmu*_*tro 3 android android-viewpager

我想在PagerTabStrip上禁用标签点击/触摸事件.基本上我只希望用户能够刷卡.我想要标签的外观,但没有触摸/点击事件.我不确定下面的xml中是否有可配置的内容.或者如果代码中有某些东西我可以做.我已经尝试重写条带的ontouch和onclick听众.但没有运气.

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/myId">

    <android.support.v4.view.PagerTabStrip
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:id="@+id/tabStripID"
        android:background="@color/dark_blue"
        android:textColor="@color/text"/>
    </android.support.v4.view.ViewPager>
Run Code Online (Sandbox Code Playgroud)

Ste*_*e B 5

覆盖PagerTabStrip上的onClick侦听器不会执行任何操作,因为onClick侦听器实际上位于PagerTabStrip类中包含的两个TextView(前一个和下一个选项卡的文本)上,并且PagerTabStrip上当前没有API可以直接访问/覆盖这些侦听器.以下是解决此问题的解决方案(也没有涉及内部PagerTabStrip实现的杂草).

我验证了以下工作:

创建自己的PagerTabStrip并通过返回true来使用onInterceptTouchEvent()中的触摸事件.这将阻止PagerTabStrip的内部onClick侦听器接收触摸事件并执行制表符切换.

public class MyPagerTabStrip extends PagerTabStrip {
    private boolean isTabSwitchEnabled;

    public MyPagerTabStrip(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.isTabSwitchEnabled = true;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.isTabSwitchEnabled) {
            return super.onInterceptTouchEvent(event);
        } else {
            return true;
       }
    }

    public void setTabSwitchEnabled(boolean isSwipeEnabled) { 
        this.isTabSwitchEnabled = isSwipeEnabled;
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设您还要禁用ViewPager滑动,这也会导致制表符切换.以下代码执行此操作(此处,您必须在onTouch()和onInterceptTouch()中返回false而不是true以允许正常触摸事件到达当前选项卡片段):

public class MyViewPager extends ViewPager {
    private boolean isSwipeEnabled;

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.isSwipeEnabled = true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.isSwipeEnabled) {
            return super.onTouchEvent(event);
        } 
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.isSwipeEnabled) {
            return super.onInterceptTouchEvent(event);
        }
        return false;
    }

    public void setPagingEnabled(boolean isSwipeEnabled) {
        this.isSwipeEnabled = isSwipeEnabled;
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住更改XML文件以引用这些新类:

<com.mypackage.MyViewPager
    ...
    <com.mypackage.MyPagerTabStrip
     ...
Run Code Online (Sandbox Code Playgroud)