クライアント用にAndroid 2.2.2アプリケーションを開発していますが、彼は次のことをしたいと考えています。
現在、onClickイベントを持つボタンがありますが、彼は好まないので、ユーザーがボタンを離したときに決定したいと考えています。
View.OnTouchListener を見つけました。これは使用する必要があると思いますが、onClickで行ったようにこのイベントをxmlに追加する可能性はありますか?
<ImageButton
Android:id="@+id/btnSaveNewGate"
Android:layout_width="@dimen/btnSaveNewGate_width"
Android:layout_height="@dimen/btnSaveNewGate_height"
Android:layout_below="@+id/radioGrGateType"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="@dimen/btnSaveNewGate_marginTop"
Android:background="@null"
Android:contentDescription="@string/layout_empty"
Android:onClick="onSaveNewGateClick"
Android:scaleType="fitXY"
Android:src="@drawable/save_gate_selector" />
さらに2つの質問があります。
ユーザーが指を離したときに関連付けられるイベントはどれですか?
onClick
の代わりにView.OnTouchListener
の使用を禁止するガイドラインはありますか?
ユーザーが指を離したときのイベントはMotionEvent.ACTION_UP
。 onClick()の代わりにView.OnTouchListenerを使用することを禁止するガイドラインがあるかどうかはわかりませんが、おそらく状況によって異なります。
サンプルコードを次に示します。
imageButton.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP){
// Do what you want
return true;
}
return false;
}
});
おそらく、OnTouchListener
ではなくOnClickListener
を使用する場合は、OnTouchListener
の追加機能が必要です。これは、OnTouchListener
の使用方法の詳細を示す補足的な回答です。
リスナーを定義する
これをアクティビティまたはフラグメントのどこかに配置します。
private View.OnTouchListener handleTouch = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i("TAG", "touched down");
break;
case MotionEvent.ACTION_MOVE:
Log.i("TAG", "moving: (" + x + ", " + y + ")");
break;
case MotionEvent.ACTION_UP:
Log.i("TAG", "touched up");
break;
}
return true;
}
};
リスナーを設定する
onCreate
(アクティビティの場合)またはonCreateView
(フラグメントの場合)でリスナーを設定します。
myView.setOnTouchListener(handleTouch);
注
getX
とgetY
は、ビュー(つまり、ビューの左上隅)に相対的な座標を提供します。ビューの上または左に移動すると、それらは負になります。画面の絶対座標が必要な場合は、getRawX
とgetRawY
を使用します。x
およびy
の値を使用して、スワイプの方向などを決定できます。OnClickは、ユーザーがボタンを離したときにトリガーされます。ただし、TouchListenerを引き続き使用する場合は、コードに追加する必要があります。それはただ:
myView.setOnTouchListener(new View.OnTouchListener()
{
// Implementation;
});