2017-03-17 82 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