我遇到了一个问题,以防止在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开发人员.
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语句.