Xamarin 表单 TabbedPage

Posted

技术标签:

【中文标题】Xamarin 表单 TabbedPage【英文标题】:Xamarin forms TabbedPage 【发布时间】:2019-03-20 21:25:09 【问题描述】:

我在我的 xamarin 表单项目中使用选项卡式页面。 我正在尝试在 android 的 MyTabsRenderer 类中使用 OnTabReselected 事件。但是像 OnTabSelected、OnTabReselected 和 OnTabUnselected 这样的事件并没有被调用。有没有人对此有任何解决方案。

xamarin 表单版本:3.2.0.871581

VS 版本:15.8.6

这是我的代码 sn-p(MyTabsRenderer Class):

using Android.OS;
using Android.Views;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android.AppCompat;
using MyProject;
using MyProject.Droid;
using Xamarin.Forms.Platform.Android;
using System.ComponentModel;
using Android.Support.V4.View;
using Android.Content.Res;
using Android.Content;
using Android.Support.Design.Widget;

[assembly: ExportRenderer(typeof(TabController), typeof(MyTabsRenderer))]
namespace MyProject.Droid

    public class MyTabsRenderer : TabbedPageRenderer, TabLayout.IOnTabSelectedListener
    


        bool setup;
        ViewPager viewPager;
        TabLayout tabLayout;

        public MyTabsRenderer(Context context) : base(context)
        
        

        protected override void SetTabIcon(TabLayout.Tab tab, FileImageSource icon)
        
            base.SetTabIcon(tab, icon);
        

        protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
        
            base.OnElementChanged(e);
        
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        
            base.OnElementPropertyChanged(sender, e);

            //if (setup)
            //    return;


            if (e.PropertyName == "Renderer" || e.PropertyName == "CurrentPage")
            
                viewPager = (ViewPager)ViewGroup.GetChildAt(0);
                tabLayout = (TabLayout)ViewGroup.GetChildAt(1);
                setup = true;
                ColorStateList colors = GetTabColor();

                for (int i = 0; i < tabLayout.TabCount; i++)
                
                    var tab = tabLayout.GetTabAt(i);
                    SetTintColor(tab, colors);
                
                tabLayout.SetOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));
            
        


        void OnTabReselected(TabLayout.Tab tab)
        
            // To have the logic only on he tab on position 1
            if (tab == null || tab.Position != 1)
            
                return;
            

            if (tab.Text == "Play")
            
                tab.SetText("Pause");
                tab.SetIcon(Resource.Drawable.icon);
                // App.pauseCard = false;
            
            else
            
                tab.SetText("Play");
                tab.SetIcon(Resource.Drawable.icon);
                //  App.pauseCard = true;
            

            SetTintColor(tab, GetTabColor());

        

        void SetTintColor(TabLayout.Tab tab, ColorStateList colors)
        
            var icon = tab?.Icon;
            if (icon != null)
            
                icon = Android.Support.V4.Graphics.Drawable.DrawableCompat.Wrap(icon);
                Android.Support.V4.Graphics.Drawable.DrawableCompat.SetTintList(icon, colors);
            
        

        ColorStateList GetTabColor()
        
            return ((int)Build.VERSION.SdkInt >= 23)
                ? Resources.GetColorStateList(Resource.Color.icon_tab, Forms.Context.Theme)
                               : Resources.GetColorStateList(Resource.Color.icon_tab);
        

    

【问题讨论】:

尝试制作方法全名void TabLayout.IOnTabSelectedListener.OnTabReselected(TabLayout.Tab tab) 你在使用android:TabbedPage.ToolbarPlacement="Bottom"吗? 【参考方案1】:

这可能是因为您将 OnTabSelectedListener 设置错误。

尝试将侦听器设置为thistabLayout.SetOnTabSelectedListener(this);

还可以查看 TabbedPageRenderer.cs source code 获得灵感,

【讨论】:

以上是关于Xamarin 表单 TabbedPage的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin 和 Xamarin 表单的符号包(PDB 文件)

Xamarin 表单发送图像

使用 Xamarin.Mobile 读取 Xamarin 表单中的联系人时出错

重复服务呼叫 - Xamarin 表单

如何将 android 活动导航到 xamarin 表单

TeamCity 上的 Xamarin 表单:Xamarin.Forms 任务与目标不匹配