我在处理一个按钮 及其两个监听器 时遇到问题。 我的目标是使用它交换按钮的两个监听器。 这不是我需要的行为。我需要释放按钮,然后以不同的方式(使用不同的监听器)再次单击它。 所以..我“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() 监听器。
谢谢大家
最佳答案
您的 OnClickListener
在 ACTION_UP
上触发,因为您从 onTouch()
无条件返回 false
。在那里返回 false
告诉 View
您还没有使用该事件,它也应该处理它。在这种情况下,这意味着 View
将执行它的点击处理,现在它有一个 OnClickListener
集,它被调用。 (事实上,您可以从一开始就设置 OnClickListener
,并且会实现相同的行为。)
在 ACTION_UP
case
中返回 true
将表明您正在那里消费该事件,因此 View
不会最终调用其 OnClickListener
。这对于您的用例可能就足够了,但是,这也意味着 View
不会执行它通常为 ACTION_UP
执行的任何其他状态更改;例如,将其 Drawable
更改为它们的未按下状态。
与其处理监听器并尝试决定要使用哪些事件以及传递哪些事件,不如处理 OnTouchListener
中的所有内容,在某种标志中跟踪当前状态变量,并再次在 onTouch()
中无条件返回 false
。通过这种方式,我们只是简单地“插入”了所需的行为,并允许 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;
}
};
关于android - 在 Android 中的监听器之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42932838/