【问题标题】:issue with if/else and switch statementsif/else 和 switch 语句的问题
【发布时间】:2025-06-27 21:20:02
【问题描述】:

下面的代码是为一个名为 crash 的按钮处理 ACTION_DOWN 和 ACTION_UP 事件。这个想法是,一旦 if/else 确定 onTouch 事件是由冲突引起的,switch 语句然后根据动作确定要做什么。我不知道问题是否在于 switch 语句没有返回 true 并且可能与问题有关。当我添加返回时,eclipse 说代码无法访问,我不明白。我的印象是,您无法在没有中断的情况下摆脱开关。

实际发生的情况是第一个声音会循环播放,但代码似乎永远不会在释放按钮时检测到动作,因此声音会一直播放。任何帮助将不胜感激。

 public boolean onTouch(View v, MotionEvent event) {
 MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.*);
 if (v.getId() == R.id.*){

 switch (event.getAction()){

 case MotionEvent.ACTION_DOWN:
  mp.setLooping(true);
  mp.start();
   break;

 case MotionEvent.ACTION_UP:
  mp.pause();
  break;
 }

}
return true;
}
   });

【问题讨论】:

  • 即使在添加“return true;”之后我仍然没有采取任何行动。在这种情况下,我什至可以放代码来播放声音,而不是采取行动,它什么也不做。
  • 我不确定这一点,但这不会在您每次按下或释放时创建一个新的 MediaPlayer 对象吗?在这种情况下,您将在与调用 start() 不同的 MediaPlayer 实例上调用 pause()
  • 确实有道理。问题是,当我将 mp 的创建移到处理 ACTION_DOWN 事件的逻辑部分时,什么也没有发生。它根本不播放任何声音。我开始考虑完全放弃 MediaPlayer,因为每次播放声音时我都必须创建和销毁对象。我所做的每次搜索都表明您不能即时设置数据源。
  • 经过仔细检查,我发现在 if/else 语句中创建了 mp 对象后,logcat 甚至看不到单击按钮的时间。就好像整个听众都坏了一样。
  • 嗯。这很奇怪。如果声音在 switch 语句之外通过 MediaPlayer 播放,则它必须达到 ACTION_DOWN 情况。我将在下面的帖子中发表一些想法 - 我现在没有办法对此进行测试,所以一些语法可能会被关闭。

标签: java if-statement switch-statement


【解决方案1】:
//Add the following line in the code before your setOnTouchListener()
MediaPlayer mp;

public boolean onTouch(View v, MotionEvent event) { 

    if (v.getId() == R.id.*){ 

        switch (event.getAction()) { 

        case MotionEvent.ACTION_DOWN: 
            mp = MediaPlayer.create(getBaseContext(), R.raw.*); 
            mp.setLooping(true); 
            mp.start(); 
            break; 

        case MotionEvent.ACTION_UP: 
            if(mp != null) 
            {
                mp.pause(); 
                mp.release();
            }
            break; 
        } 
    } 
} 

// I'm assuming this was from the onTouchListener()? -> }); 

只是一个想法。

【讨论】:

  • 效果很好。非常感谢,伙计。这是一个基本问题,但我一辈子都做不好。