をViewPager
インスタンス化する がありますView
。検索結果がビューに返される間、ビューページャーと子ボタンの両方のスクロールを一時的に無効にしたいと思います。私は電話をかけましviewPager.setEnabled(false)
たが、これはそれを無効にしません。
誰でもアイデアはありますか?
をViewPager
インスタンス化する がありますView
。検索結果がビューに返される間、ビューページャーと子ボタンの両方のスクロールを一時的に無効にしたいと思います。私は電話をかけましviewPager.setEnabled(false)
たが、これはそれを無効にしません。
誰でもアイデアはありますか?
簡単な解決策は、フラグViewPager
を持つ の独自のサブクラスを作成することです。次に、メソッドとメソッドをオーバーライドします。true に等しい場合はメソッドを呼び出し、そうでない場合は.private boolean
isPagingEnabled
onTouchEvent
onInterceptTouchEvent
isPagingEnabled
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()
。
簡単な解決策を見つけました。
//disable swiping
mViewPager.beginFakeDrag();
//enable swiping
mViewPager.endFakeDrag();
この回答を 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
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
}
}
スレイトンの答えはうまくいきます。サルのようにスワイプするのをやめたい場合は、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;
}
}
したがって、並べてスワイプすることしかできません
androidx の新しいクラス ViewPager2 により、メソッド setUserInputEnabled(false) でスクロールを無効にできます
private val pager: ViewPager2 by bindView(R.id.pager)
override fun onCreate(savedInstanceState: Bundle?) {
pager.isUserInputEnabled = false
}