【问题标题】:Play two different sound files from two different buttons?从两个不同的按钮播放两个不同的声音文件?
【发布时间】:2012-07-16 15:03:54
【问题描述】:

我尝试在很多地方搜索此问题,但找不到答案。我正在制作一个带有一组带有字母的图像按钮的应用程序。我希望能够单击字母A,并听到声音文件A。如果单击字母B,我想听到声音文件B。到目前为止,我只有字母A和B,以及声音文件A和B。当我运行我的代码,我只能听到按钮 A 的声音,当我按下字母 B 时,什么也没有发生。这是我的代码:

    package com.android.nishad.learn.hindi;

    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageButton;

    public class AlphabetActivity extends Activity implements OnClickListener {
       /** Called when the activity is first created. */
       MediaPlayer mp;

       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_alphabet);

          ImageButton btn = (ImageButton)findViewById(R.id.imageButton1);
          btn.setOnClickListener(this);

       }

       public void onClick(View v) {
          // TODO Auto-generated method stub

          mp = MediaPlayer.create(this, R.raw.lettera);
          mp.start();
          while (mp.isPlaying()) { 
             // do nothing 
          };
          mp.release();
       }



       public void onCreate1(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_alphabet);

          ImageButton btn2 = (ImageButton)findViewById(R.id.imageButton2);
          btn2.setOnClickListener(this);

       }

       public void onClick1(View v) {
          // TODO Auto-generated method stub

          mp = MediaPlayer.create(this, R.raw.letterb);
          mp.start();
          while (mp.isPlaying()) { 
             // do nothing 
          };
          mp.release();
       }
    };

【问题讨论】:

  • 你不能只在其中抛出一个onCreate1() 方法并期望它能够工作......

标签: java android file audio button


【解决方案1】:

方法onCreate1onClick1 是无用的,因为它们从未被调用过。相反,您应该将所有初始化代码放在您的 onCreate 方法中:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_alphabet);

    findViewById(R.id.imageButton1).setOnClickListener(this);
    findViewById(R.id.imageButton2).setOnClickListener(this);

}

public void onClick(View v) {

    // TODO Auto-generated method stub
    int rawid = 0;
    switch(v.getId()) {
        case R.id.imageButton1: rawid = R.raw.lettera; break;
        case R.id.imageButton2: rawid = R.raw.letterb; break;

        defalt: return;    //do nothing if none of our buttons;
    }

    mp = MediaPlayer.create(this, rawid);
    mp.start();
    while (mp.isPlaying()) { 
        // do nothing 
    };
   mp.release();
}

但是请注意,这是一种非常低效的处理方式。相反,您应该拥有一个 MediaPlayer 实例,然后根据需要使用它来播放各种声音。每次按下按钮时都创建一个新的 MediaPlayer 是一种资源浪费。

【讨论】:

  • 谢谢,我明白你的观点是浪费资源,所以我现在只创建一个 mp。谢谢!
【解决方案2】:
package com.android.nishad.learn.hindi;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

public class AlphabetActivity extends Activity implements OnClickListener {
   /** Called when the activity is first created. */
   MediaPlayer mp;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_alphabet);

      ImageButton btn = (ImageButton)findViewById(R.id.imageButton1);
      btn.setOnClickListener(this);

      ImageButton btn2 = (ImageButton)findViewById(R.id.imageButton2);
      btn2.setOnClickListener(this);

   }

   public void onClick(View v) 
   {
       switch(v.getId()) 
       {
         case R.id.imageButton1:
             mp = MediaPlayer.create(this, R.raw.lettera);
             break;
         case R.id.imageButton2:
             mp = MediaPlayer.create(this, R.raw.letterb);
             break;
         default:
             return;
       }

      mp.start();
      while (mp.isPlaying()) { 
         // do nothing 
      }
      mp.release();
   }
}

【讨论】:

  • @GurpeetSingh 没问题!如果您对我所做的事情有任何具体问题,请随时提出!
  • 嗯,while(mp.isPlaying()) 循环不是一个好主意,很可能会导致您的应用停止响应。
  • @kcoppock 我同意。我相信他会在继续开发他的应用程序时做一些更合适的事情。他可能还想为 onPause() 实现一些东西,以便当他退出 Activity 时音乐停止播放。
【解决方案3】:

试试这个:

 public void onClick(View v) {

  switch(v.getId()){

  case R.id.R.id.imageButton1:
          mp = MediaPlayer.create(this, R.raw.lettera);
          break;

  case R.id.R.id.imageButton2:
          mp = MediaPlayer.create(this, R.raw.letterb);
          break;
  }
          mp.start();
          while (mp.isPlaying()) { 
             // do nothing 
          };
          mp.release();
}

【讨论】:

    【解决方案4】:

    首先,删除那些onCreate1()onClick1() 方法。 onClick() 方法足以接收布局中所有按钮的点击事件。您可以使用view.getId() 方法执行此操作。对于播放声音,我建议使用SoundPool 类,它有一个非常清晰的界面用于此类目的。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2011-08-10
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多