我正面临着一个问题,即在Android上防止Xamarin.Forms PCL项目中的快速多重控制点击。基本上我需要解决这四种情况:
我使用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开发人员。
答案 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语句。