【问题标题】:How do I detect tab was touched in xamarin forms TabbedPage如何检测 xamarin 表单 TabbedPage 中的选项卡被触摸
【发布时间】:2015-08-12 09:37:51
【问题描述】:

如何检测 xamarin 表单 TabbedPage 中的选项卡被触摸? (这与我想出如何检测的页面更改检测不同)

原因如下: 我正在尝试解决一个相当丑陋的标签页溢出 UI (显示在标签栏右侧的丑陋滚动条 每当有 >5 个标签时) 因此,第 5 次按标签显示自定义菜单,按第二次隐藏该菜单,等等。

谢谢!

【问题讨论】:

  • 同样的问题。你能给出答案吗?

标签: xamarin.forms


【解决方案1】:

如果您尝试在 TabbedPage 中查找选择了哪个页面,您可以这样做。 使用索引值,您可以执行任何您想要的操作..

页面编号检测事件:

    this.CurrentPageChanged += (object sender, EventArgs e) => {
            var i = this.Children.IndexOf(this.CurrentPage);
            System.Diagnostics.Debug.WriteLine("Page No:"+i);
        };

【讨论】:

  • 正如我在问题中所说,当您坐在第 X 页上时,在同一选项卡上的第二次点击不会作为页面更改事件传递。因为从技术上讲,页面没有改变。
  • 我想我会接受它,因为我的发现对 6 个人来说不是问题,并且我不再使用 xamarin 来查看最新一期中是否已修复...
  • 叹息......有没有人找到一种方法来做到这一点,如果你点击你当前所在的同一页面也会捕捉到这一点?
【解决方案2】:

自从有人问这个问题以来已经有一段时间了,但以防万一这里有答案。

点击选项卡时执行的操作与以下情况相同:

  • 标签已更改
  • 标签被“重新选择”

因此,对于第一个,您可以使用@femil-shajin 的答案,或者像我在这里做的那样更直接,对于第二个,您需要为TabbedPage 制作一些自定义渲染器:

public class MyTabbedPage : TabbedPage
{
    ...

    protected override void OnCurrentPageChanged()
    {
         // do whatever
    }    
    
    public void OnTabReselected()
    {
         // do whatever
    }

    ...
}

然后在 Android 上:

[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedRenderer))]
namespace MyNamespace.Droid.Renderers
{
    public class CustomTabbedRenderer : TabbedPageRenderer, NavigationBarView.IOnItemReselectedListener
    {
        ...
        protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)
            {
                GetBottomNavigationView()?.SetOnItemReselectedListener(this);
            }
        }

        private BottomNavigationView GetBottomNavigationView()
        {
            // this may need to change on some cases 
            for (var i = 0; i < ViewGroup.ChildCount; i++)
            {
                var childView = ViewGroup.GetChildAt(i);
                if (childView is ViewGroup viewGroup)
                {
                    for (var j = 0; j < viewGroup.ChildCount; j++)
                    {
                        var childRelativeLayoutView = viewGroup.GetChildAt(j);
                        if (childRelativeLayoutView is BottomNavigationView bottomNavigationView)
                        {
                            return bottomNavigationView;
                        }
                    }
                }
            }
            return null;
        }

        public void OnNavigationItemReselected(IMenuItem item)
        {
            if (Element is MyTabbedPage tabbedPage)
            {
                tabbedPage.OnTabReselected();
            }
        } 
        ...
    }
}

在 iOS 上:

[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedRenderer))]
namespace MyNamespace.iOS.Renderers
{
    public class CustomTabbedRenderer : TabbedRenderer
    {
        private UITabBarItem _previousSelectedItem;

        ...
        public override void ViewDidAppear(bool animated)
        {
            base.ViewDidAppear(animated);

            if (SelectedIndex < TabBar.Items.Length)
            {
                _previousSelectedItem = TabBar.Items[SelectedIndex];
            }
        }

        public override void ItemSelected(UITabBar tabbar, UITabBarItem item)
        {
            if (_previousSelectedItem == item && Element is MyTabbedPage tabbedPage)
            {
                tabbedPage.OnTabReselected();
            }
            _previousSelectedItem = item;
        }
        ...
    }
}

来源:部分内容基于this page

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 2020-12-14
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多