#android #xamarin.android
#Android #xamarin.android
Вопрос:
У меня есть viewpager с 3 фрагментами. Во втором фрагменте у меня есть кнопка. В настоящее время свайп происходит как влево, так и вправо для всех 3 фрагментов. Теперь во втором фрагменте только после нажатия на кнопку пользователь должен иметь возможность перейти к третьему экрану. В противном случае свайп со второго экрана на третий должен быть заблокирован. Когда пользователь переходит к третьему экрану, он может вернуться к предыдущим экранам. Я написал код customviewpager, но он не работает для блокировки определенного свайпа. Пожалуйста, помогите мне с этой проблемой.
CustomViewPager.cs
namespace swiping
{
public class CustomViewPager : ViewPager
{
private float initialXValue;
private SwipeDirection direction;
private int position = 0;
CustomViewPager myadapter;
bool isrightswipe, isleftswipe;
public bool ShouldAllowSwipe()
{
if (this.CurrentItem == 1 amp;amp; isleftswipe == true)
{
return false;
}
return true;
}
public CustomViewPager(Context context, IAttributeSet attrs) : base(context, attrs)
{
//this.direction = SwipeDirection.all;
}
public override bool OnTouchEvent(MotionEvent e)
{
//base.OnTouchEvent(e);
//if (this.IsSwipeAllowed(e))
//{
// return base.OnTouchEvent(e);
//}
IsSwipeAllowed(e);
if (ShouldAllowSwipe())
{
base.OnTouchEvent(e);
return true;
}
return false;
}
public override bool OnInterceptTouchEvent(MotionEvent e)
{
if (this.IsSwipeAllowed(e))
{
return base.OnInterceptTouchEvent(e);
}
return false;
}
private bool IsSwipeAllowed(MotionEvent e)
{
//if (this.direction == SwipeDirection.all) return true;
//if (direction == SwipeDirection.none)//disable any swipe
//return false;
isrightswipe = false;
isleftswipe = false;
if (e.Action == MotionEventActions.Down)
{
initialXValue = e.GetX();
}
if (e.Action == MotionEventActions.Move)
{
try
{
float diffX = e.GetX() - initialXValue;
if (diffX > 0 amp;amp; direction == SwipeDirection.right)
{
// swipe from left to right detected
//prev
isleftswipe = false;
isrightswipe = true;
return false;
}
else if (diffX < 0 amp;amp; direction == SwipeDirection.left)
{
// swipe from right to left detected
//next
isleftswipe = true;
isrightswipe = false;
return false;
}
}
catch (Exception ex)
{
}
}
return true;
}
public void setAllowedSwipeDirection(SwipeDirection direction)
{
this.direction = direction;
}
}
public enum SwipeDirection
{
all, left, right, none
}
}
Ответ №1:
Я переработал ваш код и завершил решение.
using System;
using Android.Content;
using Android.Runtime;
using Android.Support.V4.View;
using Android.Util;
using Android.Views;
namespace Android.Base
{
[Register("ViewPagerWithCustomSwipe")]
public class ViewPagerWithCustomSwipe : ViewPager
{
private float InitialX;
private SwipeDirection DisabledSwipeDirection;
public ViewPagerWithCustomSwipe(Context context, IAttributeSet attrs) : base(context, attrs)
{
}
protected ViewPagerWithCustomSwipe(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
{
}
public ViewPagerWithCustomSwipe(Context context) : base(context)
{
}
public override bool OnTouchEvent(MotionEvent e)
{
if (IsSwipeAllowed(e))
return base.OnTouchEvent(e);
return false;
}
public override bool OnInterceptTouchEvent(MotionEvent e)
{
if (IsSwipeAllowed(e))
return base.OnInterceptTouchEvent(e);
return false;
}
private bool IsSwipeAllowed(MotionEvent e)
{
if (DisabledSwipeDirection == SwipeDirection.All)
return false;
if (DisabledSwipeDirection == SwipeDirection.None)
return true;
if (e.Action == MotionEventActions.Down)
InitialX = e.GetX();
if (e.Action == MotionEventActions.Move)
{
float diffX = e.GetX() - InitialX;
if (diffX > 0 amp;amp; DisabledSwipeDirection == SwipeDirection.Right)
return false;
else if (diffX < 0 amp;amp; DisabledSwipeDirection == SwipeDirection.Left)
return false;
}
return true;
}
public void DisableSwipe(SwipeDirection direction)
{
DisabledSwipeDirection = direction;
}
}
public enum SwipeDirection
{
All = 0,
Left = 1,
Right = 2,
None = 3
}
}
Вам нужно использовать control и добавить к нему OnPageChangeListener. В custom page listener вы можете реализовать свою собственную логику с отключением свайпа.
Как это использовать, вы можете посмотреть на моем github: https://gist.github.com/IlyaLavrov97/4bf2fb11ea195a0bbbaa2276a1a6c586
Счастливого кодирования! 🙂