あたも技術ブログ

セットジャパンコーポレーションの社員が運営しています。

Androidでタップの制御

アプリ開発をしているとほぼ必ず行うタップの制御。
今回はこのタップ制御を使いやすくしてみようと思います。

とりあえず普通に作っていくと、以下のようになると思います。

private boolean isTap = false;

Button button = new Button(getApplication());
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(isTap) return;
        isTap = true;
        [何かしらの処理]
        isTap = false;
    }
});

これでも特に問題はないのですが、ボタンが複数ある場合にはそれぞれに処理を書かないといけないですし、フラグの管理を間違えたらボタンが反応しなくなってしまうなどのバグが出てしまいます。

そんな問題を少しでも解消するために少し一工夫をしてみましょう。

まずはベースとなるActivity、もしくはFragmentを作成します。
そして、自動解除用のHandlerとRunnable、タップ管理用のMapを用意します。

public class BaseFragment extends Fragment{
    // 自動解除用Handler
    private Handler handler = new Handler();
    // 遅延実行のためのRunnable
    private Runnable runnable = null;
    // タップ管理用Map
    private Map<String, Boolean> map = new HashMap();
}

Activity、FragmentのonPauseでフラグの解除を行っておきます。

@Override
public void onPause() {
    super.onPause();
    map.clear();
    if (null != runnable) {
        handler.removeCallbacks(runnable);
    }
}

次にタップ管理の処理を書いていきます。

// タップ制御開始
protected void executeEvent(String key) {
    map.put(key, true);
}

// タップ制御開始(自動解除)
protected void executeEvent(String key, long delay) {
    map.put(key, true);
    runnable = new Runnable() {
        @Override
        public void run() {
            finishEvent(key);
        }
    };
    handler.postDelayed(runnable, delay);
}

// タップ制御中かどうか
protected boolean isEvent(String key) {
    return map.containkey(key);
}

// タップの制御解除
protected void finishEvent(String key) {
    map.remove(key);
}

ベースクラスを継承したActivity, Fragmentであれば以下のように使用することができます。

// 手動解除
Button button = new Button(context);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      if(isEvent("blockKey")) return;
      executeEvent("blockKey");
      [何かしらの処理]
      finishEvent("blockKey");
    }
});

// 自動解除
Button button = new Button(context);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(isEvent("blockKey")) return;
        executeEvent("blockKey", 1000); // 1秒後に自動解除
        [何かしらの処理]
    }
});

単純なタップ制御なら、自動解除が結構使いやすくて便利だと思います。
タップの管理はMapで行っているので、複数ボタン別々のイベントも簡単に実装できます!

以上、タップ制御でした!