2017-03-17 79 views
2

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

  1. 点击在导航栏
  2. 按钮和后退按钮点击按钮和硬件后退按钮
  3. 点击两个或更多按钮在相同的时间
  4. 点击相同的按钮的多个次

我使用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”事件处理程序位于MainPage上。第三种情况类似,但SecondPage中的MessageBox位于第三页上。最后一种情况会导致在NavigationStack上多次堆叠相同的页面。

是否有解决方案,涵盖所有这些情况?这个问题也适用于本机Android开发者。

Solution replicating issue

Gif representing scenario 1 & 2

回答

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更改是不安全的。如果页面是碎片,则可能必须使用接口和碎片函数,而不是静态函数。

你对所做的事情不够精确,所以我不能在代码中更精确。

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

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();”和“canClick = true”by“enableButtons();”并删除if语句,如果您使用的功能像我上面的代码。

+0

你可以更具体,并提供给我的代码你将如何解决所有情况? –

+0

这就是我一直这样做,是的它的作品:) –

+0

@Jan看答案编辑。我不能更精确,因为我不知道Xamarin表单,既不是程序生命周期。所以我做了它,如果它只是在Android上,并没有涉及片段。如果涉及到碎片(或等价物),或者每个页面都是一个活动(或等同物),则会更复杂。但是,我几乎可以肯定,如果你使用不同的活动,页面问题不会发生。 – Feuby