我在处理按钮及其两个听众时遇到问题。 我的目标是使用它交换两个按钮的监听器。 这不是我需要的行为。我需要释放按钮,然后以不同的方式再次单击它(使用不同的监听器)。 那么..我" onTouch"这个按钮,当我松开手指时,我需要更换它的" onTouch"监听" onClick()"之一。
现在,我尝试完成以下目标:
final View.OnClickListener play_listener = new View.OnClickListener() {
@Override
public void onClick(View v) { Utility.playRecording(mediaPlayer); } };
final View.OnTouchListener rec_listener = new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
if (Utility.checkPermission(view.getContext())) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Utility.startRecording(recorder, output_formats, currentFormat, file_exts, timer);
break;
case MotionEvent.ACTION_UP:
Utility.stopRecording(recorder, timer);
//disabling my onTouch Listener
recplay_button.setOnTouchListener(null);
//Setting a new listener for the same button
recplay_button.setOnClickListener(play_listener);
//Changing its color.
recplay_button.setBackground(getDrawable(R.drawable.coloranimreverse));
break;
}
} else {
Utility.requestPermission(view.getContext());
} return false; }};
所以,交换工作但我无法理解为什么在设置onClickListener之后它也执行它,播放我在另一个监听器中设置的声音。 MotionEvent.ACTION_UP是否算作点击?
你知道我怎么能通过这个?我需要的是在我在OnTouch()监听器中设置它的同一时刻不执行onClick()监听器。
谢谢大家。
答案 0 :(得分:1)
OnClickListener
ACTION_UP
正在点击false
,因为您无条件地从onTouch()
返回false
。返回View
会告诉View
您没有消费该事件,并且它应该处理它。在这种情况下,这意味着OnClickListener
将执行其点击处理,现在它已经设置了OnClickListener
,这将被调用。 (事实上,您可以从一开始就设置true
,并且会实现相同的行为。)
在ACTION_UP
case
中返回View
会表示您在那里消费了该事件,因此OnClickListener
不会最终调用它View
。这可能足以满足您的使用情况,但是,这也意味着ACTION_UP
不会执行通常对Drawable
执行的任何其他状态更改;例如,将其OnTouchListener
更改为未按下状态。
不是在处理侦听器,并试图决定要使用哪些事件以及传递哪些事件,而是最好处理false
中的所有事件,在某种标志变量中跟踪当前状态,以及再次onTouch()
无条件地返回View
。通过这种方式,我们只需简单地插入"期望的行为,并允许private boolean recordState = true;
final View.OnTouchListener rec_listener = new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
if (Utility.checkPermission(view.getContext())) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (recordState) {
Utility.startRecording(recorder, output_formats, currentFormat, file_exts, timer);
}
break;
case MotionEvent.ACTION_UP:
if (recordState) {
recordState = false;
Utility.stopRecording(recorder, timer);
recplay_button.setImageDrawable(getResources().getDrawable(R.drawable.coloranimreverse));
}
else {
Utility.playRecording(mediaPlayer);
}
}
} else {
Utility.requestPermission(view.getContext());
}
return false;
}
};
继续像往常一样处理事件和状态。
例如:
{{1}}