gpt4 book ai didi

android - 在 Android 中的监听器之间切换

转载 作者:行者123 更新时间:2023-11-30 00:38:41 27 4
gpt4 key购买 nike

我在处理一个按钮 及其两个监听器 时遇到问题。我的目标是使用它交换按钮的两个监听器。这不是我需要的行为。我需要释放按钮,然后以不同的方式(使用不同的监听器)再次单击它。所以..我“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() 监听器。

谢谢大家

最佳答案

您的 OnClickListenerACTION_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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com