Xamarin Native Android中如何禁用Tabbed Page的滑动切换?
解决Xamarin中禁用TabbedPage滑动切换的问题
嘿,作为Xamarin新手能想到自定义ViewPager来解决这个问题已经很棒了!其实你离正确答案只差一步——除了重写OnTouchEvent,还需要处理OnInterceptTouchEvent方法,因为ViewPager会先拦截触摸事件再传递给子控件。
第一步:完善自定义ViewPager类
你注释掉的OnTouchEvent逻辑是对的,但要加上OnInterceptTouchEvent来完整拦截触摸行为,这样才能彻底禁用滑动。完整代码如下:
using Android.Content; using Android.Support.V4.View; using Android.Views; public class CustomViewPager : ViewPager { // 控制是否禁用滑动的开关 public bool IsPagerDisabled { get; set; } public CustomViewPager(Context context) : base(context) { } public CustomViewPager(Context context, IAttributeSet attrs) : base(context, attrs) { } // 处理直接触摸事件 public override bool OnTouchEvent(MotionEvent e) { // 只有当不禁用滑动时,才调用父类的触摸事件处理 return !IsPagerDisabled && base.OnTouchEvent(e); } // 处理触摸事件拦截(ViewPager会先触发这个方法) public override bool OnInterceptTouchEvent(MotionEvent e) { // 禁用滑动时,不拦截也不传递事件 return !IsPagerDisabled && base.OnInterceptTouchEvent(e); } }
第二步:替换TabbedPage的默认ViewPager
TabbedPage在Android平台底层是基于ViewPager实现的,所以我们需要通过自定义渲染器,把系统默认的ViewPager替换成我们的CustomViewPager:
using Android.Content; using Android.Support.V4.View; using Android.Views; using Android.Widget; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; [assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedPageRenderer))] namespace YourAppNameSpace.Droid { public class CustomTabbedPageRenderer : TabbedPageRenderer { public CustomTabbedPageRenderer(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e) { base.OnElementChanged(e); if (Control != null) { // 获取TabbedPage里的默认ViewPager var defaultViewPager = Control.GetChildAt(0) as ViewPager; if (defaultViewPager != null) { // 获取ViewPager的父布局 var parentLayout = (ViewGroup)defaultViewPager.Parent; // 移除默认ViewPager parentLayout.RemoveView(defaultViewPager); // 创建自定义ViewPager实例 var customPager = new CustomViewPager(Context); // 复制默认ViewPager的配置 customPager.Adapter = defaultViewPager.Adapter; customPager.CurrentItem = defaultViewPager.CurrentItem; // 开启禁用滑动的开关 customPager.IsPagerDisabled = true; // 将自定义ViewPager添加到父布局 parentLayout.AddView(customPager); } } } } }
额外提示:针对特定TabbedPage禁用滑动
如果你不想让所有TabbedPage都禁用滑动,可以先创建一个自定义TabbedPage子类:
public class NonSwipeTabbedPage : TabbedPage { // 这里不需要额外代码,只是作为标记类 }
然后把渲染器里的typeof(TabbedPage)改成typeof(NonSwipeTabbedPage),这样只有继承自NonSwipeTabbedPage的页面才会禁用滑动,其他TabbedPage不受影响。
内容的提问来源于stack exchange,提问作者Tharindu Wanninayake
相关产品推荐
相关产品推荐

