150

ViewPagerインスタンス化する がありますView。検索結果がビューに返される間、ビューページャーと子ボタンの両方のスクロールを一時的に無効にしたいと思います。私は電話をかけましviewPager.setEnabled(false)たが、これはそれを無効にしません。

誰でもアイデアはありますか?

4

15 に答える 15

378

簡単な解決策は、フラグViewPagerを持つ の独自のサブクラスを作成することです。次に、メソッドとメソッドをオーバーライドします。true に等しい場合はメソッドを呼び出し、そうでない場合は.private booleanisPagingEnabledonTouchEventonInterceptTouchEventisPagingEnabledsuperreturn

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>タグに置き換えます。

このコードは、このブログ投稿から改作されました。

于 2011-10-18T21:36:02.317 に答える
36

これには簡単な修正があります:

ビューページャーのスクロールを無効にする場合は、次のようにします。

mViewPager.setOnTouchListener(new OnTouchListener() {

   public boolean onTouch(View arg0, MotionEvent arg1) {
      return true;
   }
}); 

そして、それを再度有効にしたい場合は、次のようにします。

mViewPager.setOnTouchListener(null);

それでうまくいきます。

于 2012-11-20T12:56:49.033 に答える
28

これが、スレイトンの答えの軽量版です。

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()

于 2014-09-01T08:29:30.793 に答える
21

簡単な解決策を見つけました。

//disable swiping
mViewPager.beginFakeDrag();

//enable swiping
mViewPager.endFakeDrag();
于 2015-05-15T07:56:27.153 に答える
2

この回答を Java から変換することに基づいて Kotlin バージョンを作成しました: https://stackoverflow.com/a/13437997/8023278

ViewPager のページ間のスワイプを無効にする組み込みの方法はありません。必要なのは、onTouchEvent と onInterceptTouchEvent をオーバーライドしてスワイプ アクションを防止する ViewPager の拡張機能です。より一般化するために、メソッド setSwipePagingEnabled を追加して、ページ間のスワイプを有効/無効にすることができます。

class SwipeLockableViewPager(context: Context, attrs: AttributeSet): ViewPager(context, attrs) {
    private var swipeEnabled = false

    override fun onTouchEvent(event: MotionEvent): Boolean {
        return when (swipeEnabled) {
            true -> super.onTouchEvent(event)
            false -> false
        }
    }

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        return when (swipeEnabled) {
            true -> super.onInterceptTouchEvent(event)
            false -> false
        }
    }

    fun setSwipePagingEnabled(swipeEnabled: Boolean) {
        this.swipeEnabled = swipeEnabled
    }
}

次に、レイアウト xml で、標準の ViewPager の代わりに新しい SwipeLockableViewPager を使用します。

<mypackage.SwipeLockableViewPager 
        android:id="@+id/myViewPager" 
        android:layout_height="match_parent" 
        android:layout_width="match_parent" />

これで、アクティビティ/フラグメントで呼び出すことmyViewPager.setSwipePagingEnabled(false)ができ、ユーザーはページ間をスワイプできなくなります


アップデート

2020 年現在、ViewPager2があります。ViewPager2 に移行する場合、スワイプを無効にする組み込みメソッドがあります。myViewPager2.isUserInputEnabled = false

于 2020-11-02T22:22:22.613 に答える
2
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 --- タグに置き換えます。

同じ解決策ですが、Kotlin で:

class NonSwipeableViewPager constructor(
    context: Context,
    attrs: AttributeSet?
) : ViewPager(context, attrs) {

    private var isPagingEnabled = true

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        return isPagingEnabled && super.onTouchEvent(event)
    }

    override fun onInterceptTouchEvent(event: MotionEvent?): Boolean {
        return isPagingEnabled && super.onInterceptTouchEvent(event)
    }

    fun setPagingEnabled(isEnabled: Boolean) {
        isPagingEnabled = isEnabled
    }
}
于 2019-02-03T11:48:06.250 に答える
0

スレイトンの答えはうまくいきます。サルのようにスワイプするのをやめたい場合は、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; 
        } 
    }

したがって、並べてスワイプすることしかできません

于 2012-07-20T09:47:24.110 に答える
0

androidx の新しいクラス ViewPager2 により、メソッド setUserInputEnabled(false) でスクロールを無効にできます

private val pager: ViewPager2 by bindView(R.id.pager)

override fun onCreate(savedInstanceState: Bundle?) {
    pager.isUserInputEnabled = false
}
于 2019-08-23T17:00:00.163 に答える