我可以很好地使用TabLayout
实现ViewPager
但是当正在滚动ViewPager
内的内容时(减速动画),我无法向左和向右滑动以更改为其他ViewPager
内的片段。我必须等到滚动动画停止然后滑动。
以下是我的一些代码段。
我有一个简单的activity_main.xml
布局,如下所示。
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbarHome"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"/>
<LinearLayout
android:id="@+id/mainContainerLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
</LinearLayout>
<android.support.design.widget.BottomNavigationView
android:id="@+id/btmNavView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
app:menu="@menu/menu_main" />
</LinearLayout>
然后我将包含TabLayout
和ViewPager
的片段展开到LinearLayout
中间的activity_main.xml
。这种布局如下所示:
<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:layout_height="match_parent"
android:orientation="vertical">
<com.pchatanan.sontana.custom_views.AppTabLayout
android:id="@+id/contactTabLayout"
app:tabMode="fixed"
android:layout_height="wrap_content"
android:layout_width="match_parent"
style="@style/AppTabLayout"/>
<android.support.v4.view.ViewPager
android:id="@+id/contactViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
我片段中的逻辑如下:
fragmentArray = new Fragment[]{new SimpleFragment(), new SimpleFragment(), new SimpleFragment()};
titleArray = new String[]{"fragment1", "fragment2", "fragment3"};
contactPagerAdapter = new AppPagerAdapter(getChildFragmentManager(), fragmentArray, titleArray);
contactViewPager.setAdapter(contactPagerAdapter);
contactViewPager.setOffscreenPageLimit(fragmentArray.length - 1);
contactTabLayout.setupWithViewPager(contactViewPager);
答案 0 :(得分:0)
使用此替代defualt ViewPager。
检测ScrollView
或RecyclerView
滚动时的时间。然后拨打
viewPager.setPagingEnabled(pagingEnable);
如果是pagingEnable
public class CustomViewPager extends ViewPager {
private boolean isPagingEnabled = true;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public boolean onTouchEvent(MotionEvent event) {
return this.isPagingEnabled && super.onTouchEvent(event);
}
public boolean onInterceptTouchEvent(MotionEvent event) {
return this.isPagingEnabled && super.onInterceptTouchEvent(event);
}
public void setPagingEnabled(boolean b) {
this.isPagingEnabled = b;
}
}
<强>更新强>
您可以执行反向操作,以便在ScrollView
滑动时禁用ViewPager
滚动
mScrollView.requestDisallowInterceptTouchEvent(true);
答案 1 :(得分:0)
与@Khemraj建议类似,问题是ViewPager没有拦截触摸。它只被ScrollView拦截。要解决此问题,我们应该允许ViewPage在滚动时拦截触摸:
scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View view, int i, int i1, int i2, int i3) {
viewPager.requestDisallowInterceptTouchEvent(false);
}
});
更好的实现是将CallBackListener用于包含scrollView的片段。