概要
Button オブジェクトにイベントリスナーが登録されている状況下で、
- 特定の条件下だけボタンをクリックイベントをスキップしたい。
- ボタンの画面表示をグレーアウトさせたくない。
うまくいかない方法
方法: 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;
}
});
}
/* ... */
}