在标签页子按钮单击上执行 A,在按下相同按钮 x 秒时执行 B

Posted

技术标签:

【中文标题】在标签页子按钮单击上执行 A,在按下相同按钮 x 秒时执行 B【英文标题】:Do A on tabbedpage children button click, do B when the same button is pressed for x seconds 【发布时间】:2021-03-15 14:21:40 【问题描述】:

我最近花了几个小时研究如何使这成为可能

我有一个带有主页按钮的底部标签页。我想要实现的是,当按下按钮 x 秒时,将打开一个新页面。标签页的自定义渲染器应该是什么样子的?

我已经有一个用于标签页的自定义渲染器,它确保主页按钮是一个浮动操作按钮。主页按钮的自定义渲染器:

[assembly: ExportRenderer(typeof(NavigationBar), typeof(CustomTabbedRenderer))]
namespace MysteryLocation.Droid

public class CustomTabbedRenderer : TabbedPageRenderer
  
    Context context;
    public CustomTabbedRenderer(Context context) : base(context)
    
        this.context = context;
    

    protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
    
        base.OnElementChanged(e);

        if (e.OldElement == null && e.NewElement != null)
        
            for (int i = 0; i <= this.ViewGroup.ChildCount - 1; i++)
            
                var childView = this.ViewGroup.GetChildAt(i);
                if (childView is ViewGroup viewGroup)
                
                    ((ViewGroup)childView).SetClipChildren(false);
                    for (int j = 0; j <= viewGroup.ChildCount - 1; j++)
                    
                        var childRelativeLayoutView = viewGroup.GetChildAt(j);
                        if (childRelativeLayoutView is BottomNavigationView bottomView)
                        
                            FloatingActionButton button = new FloatingActionButton(context);
                            
                            BottomNavigationView.LayoutParams parameters = new BottomNavigationView.LayoutParams(150, 150);
                            parameters.Gravity = GravityFlags.CenterHorizontal;
       
                            Drawable d = Resources.GetDrawable(Resource.Drawable.image);
                            button.SetScaleType(android.Widget.ImageView.ScaleType.Center);
                            
                            button.SetImageDrawable(d);
                            button.LayoutParameters = parameters;
                            bottomView.AddView(button);
                        
                    
                
            
        
    
  

===========

编辑

===========

在我的 customtabbedrenderer 中,我添加了 button.LongClick += Button_LongClick 和 button.Click += Button_Click 方法

private void Button_LongClick(object sender, EventArgs e)
    
            //open a page through pushasync
    
private void Button_Click(object sender, EventArgs e)
    
            //navigate to the page as usual, as it does when there's no 
              "button.Click" specified in the custom renderer
    

关于代码在给定方法中的外观有什么想法吗?

=========

编辑 2

=========

我已经解决了长按,正在打开一个新页面

button.LongClick += (object sender, LongClickEventArgs args) =>

  Application.Current.MainPage.Navigation.PushModalAsync(new NavigationPage(new Pass())); 
;

该应用程序现在可以在点击和长按上运行。剩下的问题是,我怎样才能让同一个按钮导航到它应该只做一个简单的点击时的页面?当没有“button.Click += Button_Click”和“button.LongClick += Button_Click1”时,它会导航到该页面。但是一旦我添加了一个 longclick 事件,按钮就会在点击时停止工作。

===========================

已解决

===========================

在Button_Click方法中增加了Element.CurrentPage = Element.Children[2],就这么简单。

【问题讨论】:

Android有一个原生的LongClick概念——搜索“onlongclicklistener” 关于我应该如何实现 onlongclicklistener 的任何想法或建议? @MAA 你的问题解决了吗?如果是,请回复分享您的解决方案,对遇到同样问题的其他人有帮助,谢谢。 【参考方案1】:

长按在 XF 中可能会出现问题。对于我的一个应用程序,我使用了双击:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core" 
            xmlns:CustomCtrls ="clr-namespace:D4503.CustomControls"
            xmlns:Views="clr-namespace:D4503.Views"
            x:Class="D4503.Pages.MainPage"
            BackgroundColor="StaticResource ScreenBackColor"
            ios:Page.UseSafeArea="true">
    <ContentPage.Content>
        <StackLayout>
            <Image Grid.Row="1" Grid.Column="0" x:Name="btnRed"  Style="StaticResource ColorButtonImage" Source="stoplight_red.png"
                                        Aspect="AspectFit">
                <Image.GestureRecognizers>
                    <TapGestureRecognizer Tapped="Red_Button_Tapped"/>
                    <TapGestureRecognizer Tapped="Red_Button_Tapped_Double" NumberOfTapsRequired="2" />
                </Image.GestureRecognizers>
            </Image>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

【讨论】:

就我而言,我已经完成了一个自定义选项卡式渲染器,但似乎无法找到通过 XAML 将主页按钮替换为浮动操作按钮的方法,因此为选项卡式页面使用自定义渲染器。

以上是关于在标签页子按钮单击上执行 A,在按下相同按钮 x 秒时执行 B的主要内容,如果未能解决你的问题,请参考以下文章

按下时将按钮分组以执行相同的操作

Android:如何在按下按钮时关闭一个活动并在按下另一个按钮时关闭整个后台堆栈? [复制]

PHP-在按下按钮后显示数组中的一个值

按钮或标签不起作用

在按下标签按钮时删除占位符

需要在按下按钮时“刷新”应用程序的屏幕