Java 如何禁用此特定viewpager中的滑动功能?

Java 如何禁用此特定viewpager中的滑动功能?,java,android,tabs,android-viewpager,android-tablayout,Java,Android,Tabs,Android Viewpager,Android Tablayout,我在Java方面没有那么丰富的经验,所以我自己也搞不懂。 我买了一个模板,上面有一个表格布局,如下所示(图1): 我想禁用这两个选项卡之间的滑动功能,因此只有单击选项卡“选项卡2”才能进入“选项卡2” 网上有很多教程,但没有一个适合我的代码,所以我有点困惑 这是我的标签片段: public class TabFragment extends Fragment { public static TabLayout tabLayout; public static ViewPager viewPag

我在Java方面没有那么丰富的经验,所以我自己也搞不懂。 我买了一个模板,上面有一个表格布局,如下所示(图1):

我想禁用这两个选项卡之间的滑动功能,因此只有单击选项卡“选项卡2”才能进入“选项卡2”

网上有很多教程,但没有一个适合我的代码,所以我有点困惑

这是我的标签片段:

public class TabFragment extends Fragment {
public static TabLayout tabLayout;
public static ViewPager viewPager;
public static int int_items = 2 ;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


    View x =  inflater.inflate(R.layout.tab_layout,null);
    tabLayout = (TabLayout) x.findViewById(R.id.tabs);
    viewPager = (ViewPager) x.findViewById(R.id.viewpager);

    viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));

    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        public void onPageScrollStateChanged(int state) {}
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}



    tabLayout.post(new Runnable() {
        @Override
        public void run() {
            tabLayout.setupWithViewPager(viewPager);
        }
    });

    return x;

}

class MyAdapter extends FragmentPagerAdapter {

    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {

        if(position == 0){
            return new Tab1();
        }
        if(position == 1){
            return new Tab2();
        }



        return null;
    }

    @Override
    public int getCount() {

        return int_items;

    }


    @Override
    public CharSequence getPageTitle(int position) {

        switch (position){
            case 0 :
                return "Tab 1";
            case 1 :
                return "Tab 2";

        }
        return null;
    }
}}
还有我的tab_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="wrap_content">


    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        app:tabGravity="fill"
        app:tabMode="fixed"
        android:background="@color/material_blue_grey_800"
        app:tabIndicatorColor="@color/orange"
        app:tabSelectedTextColor="@color/orange"
        app:tabTextColor="@color/white"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.design.widget.TabLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="50dp">

    </android.support.v4.view.ViewPager>



</LinearLayout>

我尽了最大努力想办法解决这个问题,但没有成功,所以我希望你们中的一个人能帮我解决这个小问题:)


非常感谢。

您需要创建一个自定义的
ViewPager
,它拦截onTouch事件并避免默认行为。这样,用户将无法在页面之间滑动,但可以触摸选项卡

您可以在已答复的位置查看此链接:

编辑

我将分步骤进行解释:

  • 创建一个名为
    nonswipableviewpager
  • 您可以保留相同的适配器
    MyAdapter


    这将避免在选项卡之间滑动,但会保持对每个选项卡的单击。

    您可以查看此链接的可能副本:@VedprakashWagh不,这就是我所说的,有很多关于如何解决此问题的答案,但没有一个适合我的代码。这是完全一样的。这个问题也想要做完全相同的事情,只在点击这些按钮时选择。检查一下。为什么只写链接回答?这个链接上有相同的答案,所以为什么不把它标记为重复的呢?是的,我已经看到了这个答案,但是我的代码看起来不一样,所以我不知道该怎么做exactly@FischGesicht您需要创建一个自定义的NonSwipeableViewPager类,如回答中所述,在XML布局中,您不应该使用android.support.v4.view.ViewPager,而应该使用答案中提到的NonSwipeableViewPager。
    import android.content.Context;
    import android.support.v4.view.ViewPager;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.animation.DecelerateInterpolator;
    import android.widget.Scroller;
    import java.lang.reflect.Field;
    
    public class NonSwipeableViewPager extends ViewPager {
    
        public NonSwipeableViewPager(Context context) {
            super(context);
            setMyScroller();
        }
    
        public NonSwipeableViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
            setMyScroller();
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            // Never allow swiping to switch between pages
            return false;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            // Never allow swiping to switch between pages
            return false;
        }
    
        //down one is added for smooth scrolling
    
        private void setMyScroller() {
            try {
                Class<?> viewpager = ViewPager.class;
                Field scroller = viewpager.getDeclaredField("mScroller");
                scroller.setAccessible(true);
                scroller.set(this, new MyScroller(getContext()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public class MyScroller extends Scroller {
            public MyScroller(Context context) {
                super(context, new DecelerateInterpolator());
            }
    
            @Override
            public void startScroll(int startX, int startY, int dx, int dy, int duration) {
                super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
            }
        }
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="wrap_content">
    
    
        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            app:tabGravity="fill"
            app:tabMode="fixed"
            android:background="@color/material_blue_grey_800"
            app:tabIndicatorColor="@color/orange"
            app:tabSelectedTextColor="@color/orange"
            app:tabTextColor="@color/white"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </android.support.design.widget.TabLayout>
    
        <NonSwipeableViewPager <!-- You will need to import this correctly with your class package -->
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="50dp">
    
        </NonSwipeableViewPager>
    
    
    
    </LinearLayout>
    
    public class TabFragment extends Fragment {
    public static TabLayout tabLayout;
    public static NonSwipeableViewPager viewPager; // This line changed
    public static int int_items = 2 ;
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
    
        View x =  inflater.inflate(R.layout.tab_layout,null);
        tabLayout = (TabLayout) x.findViewById(R.id.tabs);
        viewPager = (NonSwipeableViewPager) x.findViewById(R.id.viewpager); // This line changed
    
        viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
    
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            public void onPageScrollStateChanged(int state) {}
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
    
    
    
        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
            }
        });
    
        return x;
    
    }