12

Android アプリのボタンをすばやくクリックすると、背後にあるコードが 2 回実行されるようです。メニューボタンを2回クリックすると、onclickを起動する必要があるアクティビティが2回開始され、2回終了する必要があります。

メニューボタンをクリックするのが速すぎると、バックグラウンドで大量のアクティビティをロードでき、1つずつ終了する必要があるため、これは明らかにアプリのバグのある状態であり、これを修正したい.

この問題で何ができますか?

シンプルな onClickListeners と Buttons を使用します

編集:

回答とコメントに関して、私のメニューボタンは次のようになります。

top20Button.setOnClickListener(new OnClickListener()
{
    public void onClick(View v)
    {
        favButton.setClickable(false);
        nearButton.setClickable(false);
        highlightedButton.setClickable(false);
        top20Button.setClickable(false);

        Intent i = new Intent();
        i.putExtra("showDialog", false);
        i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        i.setClass(Search.this, Top20.class);
        startActivity(i);
        finish();

    }
});

このすべての修正後も同じです。狂った人のようにクリックすると、複数のアクティビティが履歴スタックにあり、複数回終了する必要があります。

助言がありますか ?何が間違っているのですか?

4

8 に答える 8

8

次のコードを使用できます: btn.setEnabled(false);

btn.setOnclickListener(new View.onClickListener(){

      public void onClick(View v) {
            btn.setEnabled(false);

      }
});
于 2012-07-02T09:03:24.550 に答える
5

このようにビューを一時的に無効にすることができます

public static void disableTemporarly(final View view) {

        view.setEnabled(false);
        view.post(new Runnable() {
            @Override
            public void run() {

                view.setEnabled(true);
            }
        });
    }

編集:

上記の解決策はうまくいきます。でもKotlinの力を使えばもっと良くなる

1) SafeClikc リスナーを作成する

class SafeClickListener(
        private var defaultInterval: Int = 1000,
        private val onSafeCLick: (View) -> Unit
) : View.OnClickListener {

    private var lastTimeClicked: Long = 0

    override fun onClick(v: View) {
        if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
            return
        }
        lastTimeClicked = SystemClock.elapsedRealtime()
        onSafeCLick(v)
    }
}

2) 拡張機能を追加して、任意のビューで動作するようにします。これにより、新しい SafeClickListener が作成され、作業が委任されます。

fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {

    val safeClickListener = SafeClickListener {
        onSafeClick(it)
    }
    setOnClickListener(safeClickListener)
}

3) 非常に使いやすくなりました

settingsButton.setSafeOnClickListener {
    showSettingsScreen()
}

ハッピー コトリン ;)

于 2015-05-05T13:43:05.713 に答える
2

まあ、それは予想される動作です...

SINGLE_TOP フラグを使用して新しいアクティビティを開始します

またはandroid:launchMode="singleInstance"、AndroidManifest.xml で Top20 アクティビティの設定を試してください。

于 2012-07-02T09:03:38.287 に答える
0

このソリューションは、私の要件により適しています。代わりに、表示機能の有効化/無効化を使用します。最初に、ユーザーが最後にビューを押した時間を格納する変数を作成します*。次に、ユーザーがビューを押したときに、現在の瞬間と最後にユーザーがビューを押した時間を比較するために変数に時間をキャプチャします。時間の差が小さすぎる場合、つまり速い、または非常に速い場合は無視してください。ただし、妥当な時間である場合は、最後の時間変数を現在の時間で設定し、他にやりたいことを何でもしてください。

@Override
public void onListItemClick(ListView list, View item, int position, long id) {

    Long now = System.currentTimeMillis();
    if((now - lastTimeSelected) > 500){
        lastTimeSelected = now;
        // your code goes here
    } else {
        Log.i(TAG, "Too fast!");
    }

}

他の投稿で同様の回答を見ましたが、誰もこのアプローチを好まないようです。

于 2016-03-17T21:37:39.350 に答える