LoginSignup
19
18

More than 5 years have passed since last update.

Android のボタンクリックイベントをスキップしたいとき

Posted at

概要

Button オブジェクトにイベントリスナーが登録されている状況下で、

  1. 特定の条件下だけボタンをクリックイベントをスキップしたい。
  2. ボタンの画面表示をグレーアウトさせたくない。

うまくいかない方法

方法: setEnabled(false)

setEnabled(false) を呼ぶことでクリックできなくすることはできる。
しかしこの場合はボタンがグレーアウト表示されてしまうため目的 2 に合致しない。

方法:View.setClickable(boolean)

View.setClickable(boolean) という、目的を叶えられそうな関数があるが、この関数は setOnClickListener にオブジェクトが登録されていると今回の目的どおりに動作しない。
リスナーが登録されているとボタンの clickable 属性が false になっていても自動的に true に変更されてしまうとのこと。

【参考】
http://mycode.snow69it.net/864/
http://stackoverflow.com/questions/18825747/button-setclickablefalse-is-not-working

うまくいった方法

onTouch 関数で true をリターン

スキップさせたいボタンに対して OnTouchListener を登録して、
スキップさせたい条件のときには true をリターンするようにしたらうまくいった。

サンプルコード


public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        final TextView text = (TextView)findViewById(R.id.textView);

        Button button = (Button)findViewById(R.id.button);

        // ボタンがクリックされたらテキストビューにハローワールドを表示する
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                text.setText("hello, world");
            }
        });

        button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

            if(/* スキップしたい条件 */) {
                return true;
            }

            return false;
            }
        });

    }

  /* ... */

}

19
18
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18