2011-11-30 12 views
5

Androidで奇妙なイベント処理の影響を受けています。私の問題は、ユーザーがButtonを何度もクリックすると、実際に何度も素早くイベントがキューに入れられ、次のActivityにさらに転送されるということです。ここでクリックイベントが次の開始アクティビティに転送されました

は一例です:

<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

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

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

私は、画面上の同じ座標でクリック可能である別のアイテムを持っています。何が起こる

は、ユーザーのクリックは本当に速い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

この縫い目は回避策と似ていますが、この方法では、開始するすべてのアクティビティと作成したすべてのビューでこれを行うことになっています。これは悪く見えます;-)たぶん、アクティビティの開始時にキューをリセットする方法がありますか? –

+1

私はリセットする方法がないと思います。リセットが最後のクリックの前に起きた場合(つまり、ユーザーがいまだに馬鹿げたようにクリックしている)、このコードを使用しますが、グローバルアプリケーションクラスと整数どのタイプの入力であるかを教えてください。asynctaskと同じですが、入力を表す整数を取ります。例えば、バックプレスされ、そのタイプの入力をロックします。 このような誤った誤ったクリックからユーザーを保護することができます。愚かなことにクリックしてしまった場合、アプリを愚かな行動から守ることはあまりありません。 – triggs

+0

次に、gridview全体をロックします。 – triggs

1

問題は、クリックイベントが新しいアクティビティに転送されたことではありません。問題は、新しいアクティビティを行っている最初のクリックが表示され始めたことです。ユーザーが何度か何度かクリックすると、新しいアクティビティがクリックされ、クリックされます。私はあなたの活動変更中にUIスレッドをブロックしていると仮定します。そのため、ユーザーはボタンをクリックして再度クリックしようとしているかどうかわかりません。

アクティビティの切り替えを締めてください。アクティビティの正しいUIを表示する準備が整うまで、すべてのクリックイベントをキャッチするSpinnerを使用してオーバーレイを表示することができます。このようにして、ユーザは何かが起こったことを認識し、クリックを止め、スピナーが消えるのを待つ。

+0

あなたは今100%正しいです。あなたの前提は間違っていて、私はすべてonClickを処理してstartActivityを実行します。 UIブロックをブロックする方法はありません:-)私の問題は、以前に言及した「サルのテスト」や「バカのようなものをクリックする」のようなものです。ユーザーが、ボタンが実際にクリックされたか見逃しているかを見ていないアクティビティを数回クリックします。しかし、スピナーのアイデアとオーバーレイは私にとって興味深いようです。 –

+0

ブロッキングは、次のアクティビティのビュー作成にも表示されます。onCreateで少し複雑なレイアウトを読み込んだり、初めて共有設定ファイルにアクセスした場合、onCreateメソッドはビューを拡張するのに時間がかかることがあります。 – Janusz

+0

最も悲観的なケース作成には約100msかかる。しかし、私はおそらくその問題で自分自身からユーザーに抗議しないことに決めます。 –

関連する問題