如何防止快速点击多个控件?

时间:2017-03-17 11:45:50

标签: c# android xamarin xamarin.android xamarin.forms

我正面临着一个问题,即在Android上防止Xamarin.Forms PCL项目中的快速多重控制点击。基本上我需要解决这四种情况:

  1. 点击NavigationBar中的按钮和后退按钮
  2. 点击按钮和硬件后退按钮
  3. 同时点击两个或多个按钮
  4. 多次点击同一按钮
  5. 我使用NavigationPage 3页 - MainPage,SecondPage和ThirdPage。在每个页面上都有处理导航的按钮。

    MainPage.xaml.cs中

        public async void NavigateToSecondPage(object s, EventArgs e)
        {
            await Navigation.PushAsync(new SecondPage());
        }
    

    SecondPage.xaml.cs

        public async void NavigateToMainPage(object s, EventArgs e)
        {
            if(await DisplayAlert("Alert", "Are you really sure you want to navigate back?", "yes", "no"))
                await Navigation.PopAsync();
        }
    
        public async void NavigateToThirdPage(object s, EventArgs e)
        {
            await Navigation.PushAsync(new ThirdPage());
        }
    

    ThirdPage.xaml.cs

        public async void NavigateToSecondPage(object s, EventArgs e)
        {
            await Navigation.PopAsync();
        }
    

    第一个和第二个场景导致问题,来自SecondPage“NavigateToMainPage”事件处理程序的MessageBox在MainPage上。第三种情况类似,但SecondPage的MessageBox在ThirdPage上。最后一种情况导致在NavigationStack上多次堆叠同一页面。

    有没有解决方案,涵盖所有这些情况?这个问题也适用于原生Android开发人员。

    Solution replicating issue

    Gif representing scenario 1 & 2

1 个答案:

答案 0 :(得分:3)

您可以使用全局布尔值" canClick"。默认情况下将其设置为true。点击时,检查是否为假。如果为false,则不执行任何操作(正在处理另一次单击),如果为true,则将其设置为false,启动通常在该按钮上执行的操作,然后在完成时再次将其设置为true(以处理将来的点击)。

在进行异步方法时,您可能必须设置变量public和static才能从" FirstPage" " SecondPage" ...对象,以便在正确加载时将其设置为false。

替代方式包括两个自定义函数" allowClicks()"和"禁止点击()"。禁用forbidClicks上的所有按钮,在allowClicks中启用它们。当用户单击按钮时调用禁止,然后在治疗完成时允许按钮。根据您的治疗,您可能必须使这些功能静态(这可能是不可能的)。

我希望这会有所帮助。

编辑:代码示例。

public static void disableButtons() {
    button1.setEnabled(false);
    button2.setEnabled(false);
    button3.setEnabled(false);
    button4.setEnabled(false);
}
public static void enableButtons() {
    button1.setEnabled(true);
    button2.setEnabled(true);
    button3.setEnabled(true);
    button4.setEnabled(true);
}

然后你调用yourClass.disableButtons();在每个按钮上单击。然后" yourClass.enableButtons();"治疗完成后。我不能更精确,因为我不知道你是否完全使用了android(然后,你在某个地方有活动),如果你的" Pages"是活动或碎片等等。

其余代码依赖于它。如果每个页面都是一项活动,我几乎可以肯定这更复杂,因为对暂停的活动进行UI更改是不安全的。如果Pages是片段,则可能必须使用接口和片段函数而不是静态函数。

你并不确切地知道自己在做什么,所以我在代码中可以更准确。

但是,让我们先尝试一下,假设你只有一个活动,每个页面都是"布局"这项活动(不是片段)。代码将是这样的:

private boolean canClick=true;
onCreate()中的

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        if(canClick) {
            canClick=false;
            /*show your other page here
            if showing is ascync, canClick=true; must be done AFTER showing, use services, handlers, 
            here i assume nothing is async, so i put canClick=true; directly after treatment
            */
            canClick=true;
        }
    }
});

您为每个按钮使用相同的代码,根据需要自定义每种治疗方法。你也可以替换" canClick = false;" by" disableButtons();"和" canClick = true" by" enableButtons();"如果您使用的函数与上面的代码类似,请删除if语句。