java - 媒体播放器安卓
问题描述
我正在努力设计一个小型音频播放器。
只是 4 首歌曲的列表 - 每首歌曲都有自己的 textView,当用户点击 textView 时,歌曲开始播放,但我不知道如何制作。我想为每个 textView 制作一个 onClick 方法,但真的不喜欢这个想法。
public class MainActivity extends AppCompatActivity {
MediaPlayer varMediaPlayer;
TextView song1 = (TextView) findViewById(R.id.song1);
TextView song2 = (TextView) findViewById(R.id.song2);
TextView song3 = (TextView) findViewById(R.id.song3);
TextView song4 = (TextView) findViewById(R.id.song4);
/* MediaPlayer hell = MediaPlayer.create(this, R.raw.Hell);
MediaPlayer bells = MediaPlayer.create(this, R.raw.HellsBells);
MediaPlayer shoot = MediaPlayer.create(this, R.raw.Shoot);
MediaPlayer thunder = MediaPlayer.create(this, R.raw.Thunderstruck);*/
public void playMusic (View view) {
varMediaPlayer = MediaPlayer.create(this, R.raw.Hell);
varMediaPlayer.start();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
解决方案
以下变量:
TextView song1 = (TextView) findViewById(R.id.song1);
TextView song2 = (TextView) findViewById(R.id.song2);
TextView song3 = (TextView) findViewById(R.id.song3);
TextView song4 = (TextView) findViewById(R.id.song4);
MainActivity
在创建对象时分配变量会使您的应用程序崩溃。
将它们移动到其中onCreate(Bundle)
并为每一个分配一个点击监听器TextViews
private static final int RAW_MUSIC_1 = R.raw.Hell;
private static final int RAW_MUSIC_2 = R.raw.HellsBells;
private static final int RAW_MUSIC_3 = R.raw.Shoot;
private static final int RAW_MUSIC_4 = R.raw.Thunderstruck;
private MediaPlayer varMediaPlayer;
private TextView song1, song2, song3, song4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// assign after setContentView(...) as findViewById scan the content view layout
song1 = (TextView) findViewById(R.id.song1);
song2 = (TextView) findViewById(R.id.song2);
song3 = (TextView) findViewById(R.id.song3);
song4 = (TextView) findViewById(R.id.song4);
// add click listeners
song1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
playMusic(RAW_MUSIC_1);
}
};
song2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
playMusic(RAW_MUSIC_2);
}
};
song3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
playMusic(RAW_MUSIC_3);
}
};
song4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
playMusic(RAW_MUSIC_4);
}
};
}
并将playMusic(View)
方法更改为playMusic(int)
和添加release
以及reset
从内存中释放对象的方法
private void playMusic(final int musicId) {
try {
if (mediaPlayer.isPlaying()) mediaPlayer.reset();
} catch (final Exception e) {}
try {
mediaPlayer.release();
} catch (final Exception e) {}
mediaPlayer = MediaPlayer.create(this, id);
mediaPlayer.start();
}
推荐阅读
- android - 过滤最后一个元素并添加到可变列表kotlin中的列表顶部
- javascript - 使用 API 调用响应 setState 延迟更新
- python - 通过 Pandas 动画 Matplotlib/Seaborn 情节?
- c# - 在 IIS 上使用 Visual Studio 远程调试器调试 program.cs
- php - 从 json 响应中获取特定值
- reactjs - 如何正确调用 Weatherstack 的 HTTP API GET 请求?
- c# - 本 ASP.NET 教程中如何传递控制器的名称?
- python - Toplevel() 关闭时如何停止线程
- javascript - this 指的是构造函数而不是对象(静态变量的问题)
- python - Matplotlib - 添加与散点图上绘制的颜色匹配的分类颜色条