其他分享
首页 > 其他分享> > 防止快速单击多个控件?

防止快速单击多个控件?

作者:互联网

我遇到了一个问题,以防止在Android上的Xamarin.Forms PCL项目中快速单击多个控件.基本上,我需要解决以下四种情况:

>在NavigationBar中单击按钮和后退按钮
>单击按钮和硬件后退按钮
>同时单击两个或更多按钮
>多次单击同一按钮

我将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

解决方法:

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

在执行异步方法时,可能必须设置变量public和static才能从“ FirstPage”“ SecondPage” …对象访问它,以便在正确加载时将其设置为false.

替代方法包括两个自定义函数“ allowClicks()”和“ forbidClicks()”.禁用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(然后,您在某处有活动),“页面”是活动还是片段…等.

其余代码取决于此.如果每个页面都是一项活动,我几乎可以肯定这会更加复杂,因为对暂停的活动进行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;”.通过“ disableButtons();”和“ enClickButtons();”的“ canClick = true”如果使用的是上述代码,请删除if语句.

标签:xamarin,xamarin-android,xamarin-forms,c,android
来源: https://codeday.me/bug/20191111/2020947.html