如何禁用PagerTabStrip的Tab单击事件

时间:2014-12-18 15:22:44

标签: android android-viewpager

我想在PagerTabStrip上禁用标签点击/触摸事件。基本上我只希望用户能够刷卡。我想要标签的外观,但没有触摸/点击事件。我不确定下面的xml中是否有可配置的内容。或者如果代码中有某些东西我可以做。我已经尝试覆盖了条带上的触控和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>

2 个答案:

答案 0 :(得分: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;
    }
}

我假设您还要禁用也会导致制表符切换的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;
    }
}

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

<com.mypackage.MyViewPager
    ...
    <com.mypackage.MyPagerTabStrip
     ...

答案 1 :(得分:1)

Steve B的答案几乎正常,TabStrip中只缺少onTouchEvent()覆盖(与viewpager相同)。没有它,它仍然会收到点击和更改页面(至少在Android L上)。