回答:
簡単な解決策はViewPager
、private boolean
フラグを持つ独自のサブクラスを作成することisPagingEnabled
です。次にonTouchEvent
およびonInterceptTouchEvent
メソッドをオーバーライドします。isPagingEnabled
trueの場合はsuper
メソッドを呼び出し、それ以外の場合はを呼び出しますreturn
。
public class CustomViewPager extends ViewPager {
private boolean isPagingEnabled = true;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return this.isPagingEnabled && super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return this.isPagingEnabled && super.onInterceptTouchEvent(event);
}
public void setPagingEnabled(boolean b) {
this.isPagingEnabled = b;
}
}
次に、Layout.XML
ファイル内の<com.android.support.V4.ViewPager>
タグを<com.yourpackage.CustomViewPager>
タグに置き換えます。
このコードは、このブログ投稿から適応されました。
これには簡単な修正があります:
ビューページャーのスクロールを無効にしたい場合:
mViewPager.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent arg1) {
return true;
}
});
そして、それを再び有効にしたいときは:
mViewPager.setOnTouchListener(null);
これでうまくいきます。
スレイトンの答えの私の軽量版は次のとおりです。
public class DeactivatableViewPager extends ViewPager {
public DeactivatableViewPager(Context context) {
super(context);
}
public DeactivatableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return !isEnabled() || super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return isEnabled() && super.onInterceptTouchEvent(event);
}
}
私のコードでは、でページングを無効にできますsetEnable()
。
onInterceptTouchEvent()
すると、子ビューが入力を受け取ることができなくなります。ほとんどの場合、これは意図された動作ではありません。
簡単な解決策を見つけました。
//disable swiping
mViewPager.beginFakeDrag();
//enable swiping
mViewPager.endFakeDrag();
この問題を解決する別の方法を提案します。この考えは、viewPagerをscrollViewでラップすることです。そのため、このscrollViewがスクロールできない場合、viewPagerもスクロールできません。
これが私のXMLレイアウトです:
<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/viewPager"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</HorizontalScrollView>
コードは必要ありません。
私にとってはうまくいきます。
スワイプを無効にするには
mViewPager.beginFakeDrag();
スワイプを有効にするには
mViewPager.endFakeDrag();
私にとってうまくいった最善の解決策は:
public class DeactivatedViewPager extends ViewPager {
public DeactivatedViewPager (Context context) {
super(context);
}
public DeactivatedViewPager (Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean canScrollHorizontally(int direction) {
return false;
}
}
この後、スクロールはタッチで無効になり、setCurrentItem
メソッドを使用してページを変更できます。
canScrollHorizontally()
方法は、現在のシナリオでは効果がありません。スワイプが発生しても呼び出されません。
これがKotlinとandroidXの答えです
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager
class DeactivatedViewPager @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : ViewPager(context, attrs) {
var isPagingEnabled = true
override fun onTouchEvent(ev: MotionEvent?): Boolean {
return isPagingEnabled && super.onTouchEvent(ev)
}
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
return isPagingEnabled && super.onInterceptTouchEvent(ev)
}
}
どのようにこのことについて:
私が使用CustomViewPager
して次、scrollTo方法オーバーライドする
小さなスワイプの多くを行っているとき、私は動きをチェックし、それが他のページにスクロールしません。
public class CustomViewPager extends ViewPager {
private boolean enabled;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onInterceptTouchEvent(event);
}
return false;
}
public void setPagingEnabled(boolean enabled) {
this.enabled = enabled;
}
@Override
public void scrollTo(int x, int y) {
if(enabled) {
super.scrollTo(x, y);
}
}
}
View.scrollTo(int x, int y)
この問題は解決しました。 ありがとう
ViewPager 2 alpha 2を使用している私の場合、以下のスニペットが機能します
viewPager.isUserInputEnabled = false
ユーザー入力を無効にする機能(setUserInputEnabled、isUserInputEnabled)
viewpager2 1.0.0-alpha02のその他の変更については、これを参照してください
また、いくつかの変更は最新バージョンのViewPager 2 alpha 4で行われました
orientationおよびisUserScrollable属性は、SavedStateの一部ではなくなりました
viewpager2#1.0.0-alpha04のその他の変更については、これを参照してください
スレイトンの答えはうまくいきます。サルのようにスワイプを停止したい場合は、OnPageChangeListenerを次のようにオーバーライドできます。
@Override public void onPageScrollStateChanged(final int state) {
switch (state) {
case ViewPager.SCROLL_STATE_SETTLING:
mPager.setPagingEnabled(false);
break;
case ViewPager.SCROLL_STATE_IDLE:
mPager.setPagingEnabled(true);
break;
}
}
だから、並べてスワイプするだけです
setPagingEnabled()
メソッドが何をするかは不明です。完全なコードを含めてください。
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);
}
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// stop swipe
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// stop switching pages
return false;
}
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*/);
}
}
}
次に、Layout.XMLファイルで--- com.android.support.V4.ViewPager ---タグを--- com.yourpackage.NonSwipeableViewPager ---タグに置き換えます。