Android 将以上答案结合起来 class CustomViewPager(context: Context, attrs: AttributeSet): ViewPager(context, attrs) { var swipeEnabled = false override fun onTouchEvent(ev: MotionEvent?): Boolean { return if (swipeEnabled) super.onTouchEvent(ev) else false } override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { return if (swipeEnabled) super.onInterceptTouchEvent(ev) else false } override fun executeKeyEvent(event: KeyEvent): Boolean { return if (swipeEnabled) super.executeKeyEvent(event) else false } }
在kotlin中,我们可以通过创建一个继承ViewPager类的自定义小部件并添加一个用于控制刷卡行为的标志值来解决这个问题 NoSwipePager.ktAndroid 将以上答案结合起来 class CustomViewPager(context: Context, attrs: AttributeSet): ViewPager(context, attrs) { var swipeEnabled = false override fun onTouchEvent(ev: MotionEvent?): Boolean { return if (swipeEnabled) super.onTouchEvent(ev) else false } override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { return if (swipeEnabled) super.onInterceptTouchEvent(ev) else false } override fun executeKeyEvent(event: KeyEvent): Boolean { return if (swipeEnabled) super.executeKeyEvent(event) else false } },android,android-viewpager,Android,Android Viewpager,在kotlin中,我们可以通过创建一个继承ViewPager类的自定义小部件并添加一个用于控制刷卡行为的标志值来解决这个问题 NoSwipePager.kt class NoSwipePager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) { var pagingEnabled: Boolean = false override fun onTouchEvent(event: Motio
class NoSwipePager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) {
var pagingEnabled: Boolean = false
override fun onTouchEvent(event: MotionEvent): Boolean {
return if (this.pagingEnabled) {
super.onTouchEvent(event)
} else false
}
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
return if (this.pagingEnabled) {
super.onInterceptTouchEvent(event)
} else false
}
}
在xml中
以编程方式禁用刷卡。如果kotlin android extensions
插件应用于build.gradle,则可以通过编写以下代码来禁用刷卡
view_pager.pagingEnabled = false
否则,我们可以使用以下代码禁用刷卡:
val viewPager : ViewPager = findViewById(R.id.view_pager)
viewPager.pagingEnabled = false
如果您使用的是ViewPager2,您只需使用:
viewpager.setUserInputEnabled(false)代码>
从:
启用或禁用用户启动的滚动。这包括触摸输入(滚动和投掷手势)和辅助功能输入。尚不支持禁用键盘输入。当用户启动的滚动被禁用时,通过setCurrentItem的编程滚动仍然有效。默认情况下,启用用户启动的滚动
感谢:科特林的
viewPagerNavigation.isUserInputEnabled = false
*kotlin的不可擦除可视寻呼机
导入android.content.Context
导入android.util.AttributeSet
导入android.view.MotionEvent
导入android.view.animation.Decreater插值器
导入android.widget.Scroller
导入androidx.viewpager.widget.viewpager
导入java.lang.reflect.Field
类不可擦除ViewPager:ViewPager{
构造函数(上下文:上下文?):超级(上下文!!){
setMyScroller()
}
构造函数(context:context?,attrs:AttributeSet?):super(context!!,attrs){
setMyScroller()
}
重写趣味onInterceptTouchEvent(事件:MotionEvent):布尔值{
返回错误
}
重写事件(事件:MotionEvent):布尔值{
返回错误
}
私人娱乐{
试一试{
val viewpager:Class=viewpager::Class.java
val scroller:Field=viewpager.getDeclaredField(“mScroller”)
scroller.isAccessible=true
scroller.set(这个,MyScroller(上下文))
}捕获(e:例外){
e、 printStackTrace()
}
}
内部类MyScroller(上下文:上下文?):
滚动条(上下文,减速器){
翻滚(
startX:Int,
startY:Int,
dx:Int,
狄:Int,
持续时间:整数
) {
超级startScroll(startX,startY,dx,dy,350/*1秒*/)
}
}
}
他不想返回true
以暗示触摸事件已被处理吗?有时不起作用。我使用的是一个带有FragmentPagerAdapter和几个Fragment的ViewPager。在将OnTouchListener设置为pager后,如果向左移动,UI仍然会向左移动一点。当添加pager.setCurrentItem(pager.getCurrentItem())时,它会工作
在返回前true
。似乎对我有用。为了解决一些布局问题,我的适配器中有public int getItemPosition(Object Object){return POSITION_NONE;}
,这会强制重新创建页面,可能还会解决其他问题。这是一个部分有效的解决方案。水平滑动的处理方式有些奇怪。我用一个拖放Gridview作为ViewPager的一部分进行了测试。使用此解决方案拖动时,从左向右和从右向左拖动失败。我个人认为Rajul的方法是最好的。在Android 6上(还没有在任何其他版本上测试过),如果你点击并向左拖动多次,你可以看到浏览页面向左滑动。这很有趣。@louielouie旁注:你为什么选择0dp
height/1
weight解决方案而不是match\u parent
height来实现全屏效果,有什么特别的原因吗?这样做是否会提高性能?此答案不会阻止在使用键盘左/右键时进行页面滑动(在模拟器中尝试)。触摸设备可能没有问题,但电视和笔记本电脑可能有问题。@MarvinLabs@Thorbear禁用键盘滚动页面的正确方法是覆盖executeKeyEvent()
。这是随后调用allowScroll()
的方法//永远不允许通过键盘左键、右键、TAB键和SHIFT+TAB键进行滑动
@覆盖公共布尔executeKeyEvent(KeyEvent事件){return false;}
这也会禁用垂直滚动。。。如果你使用的是ListView,这是不好的。我希望google能够提供一种方法,我们可以提供一种界面方法来处理触摸/刷卡,因为我相信这不会造成伤害。对于一个有多个子视图且使用水平滚动的视图(例如AChartEngine图表)来说,它非常适合。在我的片段中,我使用一个对我的活动的回调,告诉它根据用户是触摸(操作\移动)图表还是离开图表(操作\取消)来关闭分页。谢谢!您可以使用启用返回和&super.onTouchEvent(事件)简化onTouchEvent
和oninterceptouchevent
方法代码>我还建议将字段名称从“enabled”更改为“swipagechangenabled”或类似的内容。编写代码一个月后,您几乎不记得“enabled”是什么意思,尤其是当您的类被称为“CustomViewPager”时,其中不清楚自定义是什么。这也是风格的问题,但如果您不想最终得到不受支持的项目,那么风格很重要,完全重写比修复它更容易。我在哪里称为SetPaginEnabled?\uz@Ntikki,在声明ViewPager
后,您可以调用setPaginEnabled()
方法,如下所示:CustomViewPager yourCustomViewPager=(CustomViewPager)findViewById(R.id.yourCustomViewPager);yourCustomViewPager.SetPaginEnabled(false)
谢谢,这在另一个ViewPager中的ViewPager上非常有效。这对我很有效,对另一个ViewPager中的ViewPager也很有效。在这种情况下,正确的解决方案对我不起作用
<mypackage.CustomViewPager
android:id="@+id/myViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
private boolean swipeable;
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager);
try {
swipeable = a.getBoolean(R.styleable.MyViewPager_swipeable, true);
} finally {
a.recycle();
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return swipeable ? super.onInterceptTouchEvent(event) : false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return swipeable ? super.onTouchEvent(event) : false;
}
<declare-styleable name="MyViewPager">
<attr name="swipeable" format="boolean" />
</declare-styleable>
<mypackage.MyViewPager
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/viewPager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:swipeable="false" />
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
if (position == MANDATORY_PAGE_LOCATION && positionOffset > 0.5) {
mViewPager.setCurrentItem(MANDATORY_PAGE_LOCATION, true);
}
}
int PAGE = 2;
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (viewPager.getCurrentItem() == PAGE) {
viewPager.setCurrentItem(PAGE-1, false);
viewPager.setCurrentItem(PAGE, false);
return true;
}
return false;
}
public class LockableViewPager extends ViewPager {
private boolean swipeLocked;
public LockableViewPager(Context context) {
super(context);
}
public LockableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public boolean getSwipeLocked() {
return swipeLocked;
}
public void setSwipeLocked(boolean swipeLocked) {
this.swipeLocked = swipeLocked;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return !swipeLocked && super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return !swipeLocked && super.onInterceptTouchEvent(event);
}
@Override
public boolean canScrollHorizontally(int direction) {
return !swipeLocked && super.canScrollHorizontally(direction);
}
}
mViewPager.beginFakeDrag();
mViewPager.endFakeDrag();
public class ScrollableViewPager extends ViewPager {
private boolean canScroll = true;
public ScrollableViewPager(Context context) {
super(context);
}
public ScrollableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setCanScroll(boolean canScroll) {
this.canScroll = canScroll;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return canScroll && super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return canScroll && super.onInterceptTouchEvent(ev);
}
}
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<RelativeLayout
android:id="@+id/dummyView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</RelativeLayout>
dummyView = (RelativeLayout) findViewById(R.id.dummyView);
dummyView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Just leave this empty
}
});
@Override
public boolean executeKeyEvent(KeyEvent event)
{
return isPagingEnabled ? super.executeKeyEvent(event) : false;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Support.V4.View;
using Android.Util;
namespace YourNameSpace.ViewPackage {
// Need to disable swiping for ViewPager, if user performs Pre DSA and the dsa is not completed yet
// http://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still-be-able-to-s
public class CustomViewPager: ViewPager {
public bool ScrollEnabled;
public CustomViewPager(Context context, IAttributeSet attrs) : base(context, attrs) {
this.ScrollEnabled = true;
}
public override bool OnTouchEvent(MotionEvent e) {
if (this.ScrollEnabled) {
return base.OnTouchEvent(e);
}
return false;
}
public override bool OnInterceptTouchEvent(MotionEvent e) {
if (this.ScrollEnabled) {
return base.OnInterceptTouchEvent(e);
}
return false;
}
// For ViewPager inside another ViewPager
public override bool CanScrollHorizontally(int direction) {
return this.ScrollEnabled && base.CanScrollHorizontally(direction);
}
// Some devices like the Galaxy Tab 4 10' show swipe buttons where most devices never show them
// So, you could still swipe through the ViewPager with your keyboard keys
public override bool ExecuteKeyEvent(KeyEvent evt) {
return this.ScrollEnabled ? base.ExecuteKeyEvent(evt) : false;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<YourNameSpace.ViewPackage.CustomViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:layout_alignParentTop="true" />
</LinearLayout>
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs)
{
super(context,attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
try {
return super.onInterceptTouchEvent(event);
} catch (IllegalArgumentException e) {
return false;
}
}
}
This worked for me
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (viewPager.getCurrentItem() == 0) {
viewPager.setCurrentItem(-1, false);
return true;
}
else if (viewPager.getCurrentItem() == 1) {
viewPager.setCurrentItem(1, false);
return true;
}
else if (viewPager.getCurrentItem() == 2) {
viewPager.setCurrentItem(2, false);
return true;
}
return true;
}
});
<HorizontalScrollView
android:id="@+id/horizontalScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</HorizontalScrollView>
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class ViewPagerNoSwipe extends ViewPager {
/**
* Is swipe enabled
*/
private boolean enabled;
public ViewPagerNoSwipe(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = false; // By default swiping is disabled
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return this.enabled ? super.onTouchEvent(event) : false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return this.enabled ? super.onInterceptTouchEvent(event) : false;
}
@Override
public boolean executeKeyEvent(KeyEvent event) {
return this.enabled ? super.executeKeyEvent(event) : false;
}
public void setSwipeEnabled(boolean enabled) {
this.enabled = enabled;
}
}
<package.path.ViewPagerNoSwipe
android:layout_width="match_parent"
android:layout_height="match_parent" />
public class ViewPagerNoSwipe extends ViewPager {
private final GestureDetector gestureDetector;
private OnSwipeListener mOnSwipeListener;
public void setOnSwipeListener(OnSwipeListener onSwipeListener) {
mOnSwipeListener = onSwipeListener;
}
public ViewPagerNoSwipe(@NonNull Context context) {
super(context);
gestureDetector = new GestureDetector(context, new GestureListener());
}
public ViewPagerNoSwipe(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
gestureDetector = new GestureDetector(context, new GestureListener());
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
gestureDetector.onTouchEvent(ev);
return false;
}
public class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeRight();
} else {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeLeft();
}
result = true;
}
} else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeBottom();
} else {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeTop();
}
result = true;
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public interface OnSwipeListener {
void onSwipeRight();
void onSwipeLeft();
void onSwipeTop();
void onSwipeBottom();
}
}
postsPager.setOnSwipeListener(new ViewPagerNoSwipe.OnSwipeListener() {
@Override
public void onSwipeRight() {
postsPager.setCurrentItem(postsPager.getCurrentItem() + 1,false);
}
@Override
public void onSwipeLeft() {
postsPager.setCurrentItem(postsPager.getCurrentItem() - 1, false);
}
...
}
public class CustomViewPager extends ViewPager {
private boolean swipeLocked;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public boolean getSwipeLocked() {
return swipeLocked;
}
public void setSwipeLocked(boolean swipeLocked) {
this.swipeLocked = swipeLocked;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return !swipeLocked && super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return !swipeLocked && super.onInterceptTouchEvent(event);
}
@Override
public boolean canScrollHorizontally(int direction) {
return !swipeLocked && super.canScrollHorizontally(direction);
}
}
<androidx.viewpager2.widget.ViewPager2
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:orientation="vertical" />
viewPager2.setUserInputEnabled(false);
viewPager2.setUserInputEnabled(true);
shareViewPager?.setOnTouchListener(object :View.OnTouchListener{
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
for (PAGE in 0..shareViewPager.adapter!!.count){
if (shareViewPager.currentItem==PAGE){
shareViewPager.setCurrentItem(PAGE-1,false)
shareViewPager.setCurrentItem(PAGE,false)
}}
return true
}
})
class CustomViewPager(context: Context, attrs: AttributeSet): ViewPager(context, attrs) {
var swipeEnabled = false
override fun onTouchEvent(ev: MotionEvent?): Boolean {
return if (swipeEnabled) super.onTouchEvent(ev) else false
}
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
return if (swipeEnabled) super.onInterceptTouchEvent(ev) else false
}
override fun executeKeyEvent(event: KeyEvent): Boolean {
return if (swipeEnabled) super.executeKeyEvent(event) else false
}
}
class NoSwipePager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) {
var pagingEnabled: Boolean = false
override fun onTouchEvent(event: MotionEvent): Boolean {
return if (this.pagingEnabled) {
super.onTouchEvent(event)
} else false
}
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
return if (this.pagingEnabled) {
super.onInterceptTouchEvent(event)
} else false
}
}
view_pager.pagingEnabled = false
val viewPager : ViewPager = findViewById(R.id.view_pager)
viewPager.pagingEnabled = false
viewPagerNavigation.isUserInputEnabled = false
* NonSwipebleViewPager for kotlin
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.animation.DecelerateInterpolator
import android.widget.Scroller
import androidx.viewpager.widget.ViewPager
import java.lang.reflect.Field
class NonSwipebleViewPager : ViewPager {
constructor(context: Context?) : super(context!!) {
setMyScroller()
}
constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) {
setMyScroller()
}
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
return false
}
override fun onTouchEvent(event: MotionEvent): Boolean {
return false
}
private fun setMyScroller() {
try {
val viewpager: Class<*> = ViewPager::class.java
val scroller: Field = viewpager.getDeclaredField("mScroller")
scroller.isAccessible = true
scroller.set(this, MyScroller(context))
} catch (e: Exception) {
e.printStackTrace()
}
}
inner class MyScroller(context: Context?) :
Scroller(context, DecelerateInterpolator()) {
override fun startScroll(
startX: Int,
startY: Int,
dx: Int,
dy: Int,
duration: Int
) {
super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/)
}
}
}