2011-11-30 50 views
5

我受Android中奇怪事件處理的影響。我的問題是,如果用戶多次點擊Button很快,則事件將排隊並進一步轉移到下一個ActivityClick事件轉移到下一次啓動活動

下面是一個例子:

<Button 
    android:id="@+id/btn_home_show" 
    style="@style/main_buttons" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/home_label_show" /> 

ActivityonClick

public void onClick(View view) { 
    int viewId = view.getId(); 

    if (viewId == EXPECTED_VIEW_ID) { 
     Intent intent = new Intent(this, CarouselActivity.class); 
     startActivity(intent); 
    } 
} 

在我Activity我有另一個項目是點擊在屏幕上相同的座標。

如果用戶在Button上點擊確實很快,那麼這個點擊事件將被轉移到新開始的Activity,並且另一個onClick處理髮生。

我試過2.3.3 & 2.3.5框架版本&的行爲是一樣的。有任何想法嗎?

回答

1

簡單的解決辦法是添加確定點擊是否被處理,然後創建一個睡,然後一個線程一個布爾值,並將其值設爲真

public void onClick(View view) { 

    if (inputAllowed) { 
     //do stuff 
    } 
} 

boolean inputAllowed = true; 
private class ButtonDelay extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     try { 
      inputAllowed = false; 

      Thread.sleep(500); 
      inputAllowed = true; 
     } catch (InterruptedException e) { 

      e.printStackTrace(); 
     } 
     return null; 

    } 

    @Override 
    protected void onPostExecute(final Void unused) { 

    } 

} 

而在的onCreate立即啓動的AsyncTask() 。至於爲什麼會發生這種情況,我猜這個新的活動已經創建了新的按鈕,並且由於用戶正在快速點擊它註冊這些點擊。

+0

這個接縫就像一個變通方法,但這種方式我應該在每一個活動開始和每個視圖創建。這看起來很糟糕;-)也許有一種方法可以在Activity啓動時「重置」隊列嗎? –

+1

我不認爲有重置的方法,如果在最後一次點擊之前發生重置(即用戶仍然像傻瓜一樣點擊),沒有意義,我使用這段代碼,但是我擁有全局應用程序類和整數告訴它是什麼類型的輸入,相同的asynctask,但它需要代表輸入的整數,例如回推並鎖定該類型的輸入。 您可以保護用戶免受這樣的意外錯誤點擊,如果他們愚蠢地點擊離開,那麼沒有多少可以保護您的應用程序免受他們的虛假行爲。 – triggs

+0

然後鎖定整個gridview。 – triggs

1

你的問題不是點擊事件轉移到新的活動。問題在於,在您進行第一次點擊後,您的新活動將開始出現。如果用戶再次點擊了一段時間,您的新Activity將按照它應該執行的操作加載並接收點擊。我假設你在更改活動期間阻止了UI線程,並且因爲用戶不確定他是否點擊了按鈕並嘗試再次單擊該按鈕。

嘗試加快您的活動切換。您可以使用微調器顯示覆蓋圖,捕捉所有點擊事件,直到您準備好顯示活動的正確UI。用戶通過這種方式意識到發生了一些事情,並停止點擊並等待微調器消失。

+0

你現在100%正確。你的假設是錯誤的,我所做的就是處理onClick並執行startActivity。沒辦法,它阻止UI線程:-)我的問題是前面提到的「猴子測試」或「像一個白癡點擊」。用戶在活動上單擊幾次,而不是查看按鈕是否真的被點擊或錯過。然而,與微調主意疊加看起來很有趣。 –

+0

阻塞還可以出現在創建下一個活動的視圖中。如果您在onCreate中加載一點點複雜的佈局或首次訪問共享的首選項文件,onCreate方法可能需要一些時間才能使視圖膨脹。 – Janusz

+0

在最悲觀的情況下創作大約需要100ms。不過,我可能會決定不會在這個問題上抗議用戶。 –