ฉันมีViewPager
ที่ instantiates View
ฉันต้องการปิดใช้งานทั้งการเลื่อนดูเพจเจอร์และปุ่มลูกศรชั่วขณะในขณะที่ผลการค้นหากลับสู่มุมมอง ฉันกำลังโทรviewPager.setEnabled(false)
แต่นี่ไม่ได้ปิดการใช้งาน
ใครมีความคิดเห็นบ้าง
ฉันมีViewPager
ที่ instantiates View
ฉันต้องการปิดใช้งานทั้งการเลื่อนดูเพจเจอร์และปุ่มลูกศรชั่วขณะในขณะที่ผลการค้นหากลับสู่มุมมอง ฉันกำลังโทรviewPager.setEnabled(false)
แต่นี่ไม่ได้ปิดการใช้งาน
ใครมีความคิดเห็นบ้าง
คำตอบ:
ทางออกที่ง่ายคือการสร้างคลาสย่อยของคุณเองViewPager
ซึ่งมี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);
นั่นจะเป็นการหลอกลวง
นี่คือตัวแปรน้ำหนักเบาของคำตอบของ slayton:
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
ฉันตรวจสอบการเคลื่อนไหวเมื่อทำการ swipes ขนาดเล็กจำนวนมากมันไม่ได้เลื่อนไปที่หน้าอื่น
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 อัลฟา 2 ตัวอย่างด้านล่างทำงาน
viewPager.isUserInputEnabled = false
ความสามารถในการปิดใช้งานการป้อนข้อมูลผู้ใช้ (setUserInputEnabled, isUserInputEnabled)
อ้างถึงสิ่งนี้สำหรับการเปลี่ยนแปลงเพิ่มเติมในviewpager2 1.0.0-alpha02
นอกจากนี้ยังมีการเปลี่ยนแปลงบางอย่างที่ทำในเวอร์ชันล่าสุด ViewPager 2 อัลฟา 4
การวางแนวและแอตทริบิวต์ isUserScrollable ไม่ได้เป็นส่วนหนึ่งของ SavedState อีกต่อไป
อ้างถึงสิ่งนี้สำหรับการเปลี่ยนแปลงเพิ่มเติมในviewpager2 # 1.0.0-alpha04
คลาสใหม่ ViewPager2 จาก androidx อนุญาตให้ปิดการเลื่อนด้วยเมธอด setUserInputEnabled (false)
private val pager: ViewPager2 by bindView(R.id.pager)
override fun onCreate(savedInstanceState: Bundle?) {
pager.isUserInputEnabled = false
}
คำตอบของ slayton ทำงานได้ดี หากคุณต้องการหยุดรูดเหมือนลิงคุณสามารถแทนที่ 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 ---