我有 5 个线性布局,每个包含一个单选按钮和一个 ImageView 以及一些填充。如果用户单击包含单选按钮的线性布局的任何部分,我希望单击单选按钮。为了获得单选按钮的按下状态,我认为从 ontouchlistener 调度触摸事件是最好的方法。
我的问题是如何最好地实现这一点?
这是我尝试手动设置按下状态的一种方法:
@Override
public boolean onTouch(View v, MotionEvent arg1) {
//gets the index of which LinearLayout was touched
int rb = lArray.indexOf(v);
// uses this to identify the LinearLayout and RadioButton to control
LinearLayout l = lArray.get(rb);
RadioButton r = rbArray.get(rb);
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN:
Sy = arg1.getY();
if (rb != -1) {
r.setPressed(true);
}
break;
case MotionEvent.ACTION_MOVE:
My = arg1.getY();
if (rb != -1 && Math.abs(Sy - My) > l.getHeight() / 2) {
r.setPressed(false);
}
break;
case MotionEvent.ACTION_UP:
My = Sy = 0;
if (rb != -1) {
if (r.isPressed() && r.isEnabled()) {
r.performClick();
}
}
for (RadioButton b : rbArray) {
b.setPressed(false);
}
break;
}
return true;
}
}
这工作得相当好,但当用户有时将手指从布局中拖出时,会导致 onPressed 状态永久保留的偶尔打嗝。
另一种尝试是这样的:
@Override
public boolean onTouch(View v, MotionEvent event) {
int rb = lArray.indexOf(v);
RadioButton r = rbArray.get(rb);
r.dispatchTouchEvent(event);
return true;
}
但是,这仅在确实只是单击时才调用 onclick,但如果用户在布局上拖动手指则将其停用。
有没有办法我可以做到这一点?