2012-07-30 74 views
0

我该如何修改它,以便如果一个声音已经播放而另一个声音被点击,那么以前停止播放并且新选择的开始播放?感谢大家提前帮助他们。 (这是不是所有的代码只是最重要的)在一个android音板如何使一个声音停止播放后,另一个点击?

public class newBoard extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.main); 

    Toast.makeText(this, "Thank you for using this App.", Toast.LENGTH_LONG).show(); 

    // ads - load request to display 
    AdView layout = (AdView)this.findViewById(R.id.adView); 

    // ads - load display with an ad 
    AdRequest adRequest = new AdRequest(); 
    adRequest.setTesting(true); 

    layout.loadAd(adRequest); 

    // import sound files 
    final MediaPlayer sound01 = MediaPlayer.create(this, R.raw.sound01); 
    final MediaPlayer sound02 = MediaPlayer.create(this, R.raw.sound02); 
    final MediaPlayer sound03 = MediaPlayer.create(this, R.raw.sound03); 
    final MediaPlayer sound04 = MediaPlayer.create(this, R.raw.sound04); 
    final MediaPlayer sound05 = MediaPlayer.create(this, R.raw.sound05); 
    final MediaPlayer sound06 = MediaPlayer.create(this, R.raw.sound06); 
    final MediaPlayer sound07 = MediaPlayer.create(this, R.raw.sound07); 
    final MediaPlayer sound08 = MediaPlayer.create(this, R.raw.sound08); 
    final MediaPlayer sound09 = MediaPlayer.create(this, R.raw.sound09); 
    final MediaPlayer sound10 = MediaPlayer.create(this, R.raw.sound10); 
    final MediaPlayer sound11 = MediaPlayer.create(this, R.raw.sound11); 
    final MediaPlayer sound12 = MediaPlayer.create(this, R.raw.sound12); 
    final MediaPlayer sound13 = MediaPlayer.create(this, R.raw.sound13); 
    final MediaPlayer sound14 = MediaPlayer.create(this, R.raw.sound14); 
    final MediaPlayer sound15 = MediaPlayer.create(this, R.raw.sound15); 
    final MediaPlayer sound16 = MediaPlayer.create(this, R.raw.sound16); 
    final MediaPlayer sound17 = MediaPlayer.create(this, R.raw.sound17); 
    final MediaPlayer sound18 = MediaPlayer.create(this, R.raw.sound18); 
    final MediaPlayer sound19 = MediaPlayer.create(this, R.raw.sound19); 
    final MediaPlayer sound20 = MediaPlayer.create(this, R.raw.sound20); 
    final MediaPlayer sound21 = MediaPlayer.create(this, R.raw.sound21); 
    final MediaPlayer sound22 = MediaPlayer.create(this, R.raw.sound22); 
    final MediaPlayer sound23 = MediaPlayer.create(this, R.raw.sound23); 
    final MediaPlayer sound24 = MediaPlayer.create(this, R.raw.sound24); 
    final MediaPlayer sound25 = MediaPlayer.create(this, R.raw.sound25); 

    // play sound files on clicks 
    Button s01 = (Button) findViewById(R.id.button01); 
    s01.setText(this.getString(R.string.quote01)); 
    s01.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      try { 
       sound01.prepare(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      sound01.start();     
      } 

    }); 
    registerForContextMenu(s01); 

    Button s02 = (Button) findViewById(R.id.button02); 
    s02.setText(this.getString(R.string.quote02)); 
    s02.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      try { 
       sound02.prepare(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      sound02.start(); 
     } 
    }); 
    registerForContextMenu(s02); 

    Button s03 = (Button) findViewById(R.id.button03); 
    s03.setText(this.getString(R.string.quote03)); 
    s03.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      try { 
       sound03.prepare(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      sound03.start(); 
     } 
    }); 
    registerForContextMenu(s03); 

    Button s04 = (Button) findViewById(R.id.button04); 
    s04.setText(this.getString(R.string.quote04)); 
    s04.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      try { 
       sound04.prepare(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      sound04.start(); 
     } 
    }); 
    registerForContextMenu(s04); 

    Button s05 = (Button) findViewById(R.id.button05); 
    s05.setText(this.getString(R.string.quote05)); 
    s05.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      try { 
       sound05.prepare(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      sound05.start(); 
     } 
    }); 
    registerForContextMenu(s05); 

    Button s06 = (Button) findViewById(R.id.button06); 
    s06.setText(this.getString(R.string.quote06)); 
    s06.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      try { 
       sound06.prepare(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      sound06.start(); 
     } 
    }); 
    registerForContextMenu(s06); 

回答

2

使用对象的成员变量来保存到您的当前播放声音,使您可以拨打stop(),不要忘记为null检查。一旦您离开您的活动,请不要忘记release()您的MediaPlayer对象。

以下可能是一个更好的设计:将所有音频文件移动到您的资产目录,并将文件名放在按钮的标记中,使用相同的单击事件处理程序获取一个MediaPlayer对象的状态,并将其停止它正在播放,将新文件设置为从按钮的标签播放并播放文件。这将显着减少重复的代码。

2

使用单个MediaPlayer实例。你的设备在大多数设备上都会失败,因为无论如何分配给MediaPlayer的许多实例都是如此。而且,重复的代码很糟糕。糟糕的不好:

public class NewBoard extends Activity { 
    private MediaPlayer player; 
    private Resources res; 

    private int buttonIds = { R.id.button01, R.id.button02, R.id.button03, 
           R.id.button04, R.id.button05, R.id.button06, 
           R.id.button07, R.id.button08, R.id.button09, 
           R.id.button10, R.id.button11, R.id.button12, 
           R.id.button13, R.id.button14, R.id.button15, 
           R.id.button16, R.id.button16, R.id.button17, 
           R.id.button18, R.id.button19, R.id.button20, 
           R.id.button21, R.id.button22, R.id.button23, 
           R.id.button24, R.id.button25 }; 

    private int soundIds = { R.raw.sound01, R.raw.sound02, R.raw.sound03, 
           R.raw.sound04, R.raw.sound05, R.raw.sound06, 
           R.raw.sound07, R.raw.sound08, R.raw.sound09, 
           R.raw.sound10, R.raw.sound11, R.raw.sound12, 
           R.raw.sound13, R.raw.sound14, R.raw.sound15, 
           R.raw.sound16, R.raw.sound16, R.raw.sound17, 
           R.raw.sound18, R.raw.sound19, R.raw.sound20, 
           R.raw.sound21, R.raw.sound22, R.raw.sound23, 
           R.raw.sound24, R.raw.sound25 }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.main); 

     //Kill this with fire -- just an unnecessary user annoyance. 
     Toast.makeText(this, 
      "Thank you for using this App.", Toast.LENGTH_LONG).show(); 

     AdView layout = (AdView)findViewById(R.id.adView); 
     AdRequest adRequest = new AdRequest(); 
     adRequest.setTesting(true); 
     layout.loadAd(adRequest); 

     player = new MediaPlayer(); 
     res = getResources(); 

     for(int i = 0, n = buttonIds.length(); i < n; i++) { 
      Button button = (Button)findViewById(buttonIds[i]); 
      button.setOnClickListener(new SoundClickListener(soundIds[i])); 
     } 
    } 

    private class SoundClickListener implements OnClickListener { 
     private int id; 

     public SoundClickListener(int soundId) { 
      id = soundId; 
     } 

     public void onClick(View v) { 
      player.reset(); 
      player.setDataSource(
       res.openRawResourceFd(id).getFileDescriptor()); 
      player.prepare(); 
      player.start(); 
     } 
    } 
} 

就像这样。可能或不可以按原样编译。另外,正如所评论的,用火烧掉Toast--这只是令人讨厌。

相关问题