android - 当声音停止播放时打开另一个活动
问题描述
我有下面的 RecyclerView 适配器。
如您所见,每个 RecyclerView 项目都有特定的声音。
如何让项目点击等到相关声音播放完毕?
目前,当单击 RecyclerView 项目时,它会立即跳转到预期的活动,而无需等待声音播放完毕。
所以,应该是这样
的: 1. 用户点击 RecyclerView 项目。
2.相关声音开始播放。
3. 声音播放完毕。
4. 一个新的活动开始。
适配器
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.ViewHolder> {
RecyclerView.Adapter.StateRestorationPolicy PREVENT_WHEN_EMPTY;
private String[] titles = {"Topic1","Topic2","Topic3","Topic4","Topic5","Topic6","Topic7","Topic8","Topic9","Topic10"};
private ArrayList<Item> items;
private Context context;
public RvAdapter(ArrayList<Item> items, Context context) { this.items = items; this.context = context; }
MediaPlayer main_mp;
@NonNull
@Override
public RvAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent,false);
return new ViewHolder(view); }
@Override
public void onBindViewHolder(@NonNull RvAdapter.ViewHolder holder, final int position) {
releaseMediaPlayer();
final Item item = items.get(position);
holder.imageView.setImageResource(item.getImageResource());
holder.textView.setText(titles[position]);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { releaseMediaPlayer();
Context context = RvAdapter.this.context;
final Intent intent;
switch (position){
case 0: setupMediaPlayer(R.raw.topic1sound); intent = new Intent(context, Topic1.class); break;
case 1: setupMediaPlayer(R.raw.topic2sound); intent = new Intent(context, Topic2.class); break;
case 2: setupMediaPlayer(R.raw.topic3sound); intent = new Intent(context, Topic3.class); break;
case 3: setupMediaPlayer(R.raw.topic4sound); intent = new Intent(context, Topic4.class); break;
case 4: setupMediaPlayer(R.raw.topic5sound); intent = new Intent(context, Topic5.class); break;
case 5: setupMediaPlayer(R.raw.topic6sound); intent = new Intent(context, Topic6.class); break;
case 6: setupMediaPlayer(R.raw.topic7sound); intent = new Intent(context, Topic7.class); break;
case 7: setupMediaPlayer(R.raw.topic8sound); intent = new Intent(context, Topic8.class); break;
case 8: setupMediaPlayer(R.raw.topic9sound); intent = new Intent(context, Topic9.class); break;
case 9: setupMediaPlayer(R.raw.topic10sound); intent = new Intent(context, Topic10.class); break;
default: throw new IllegalStateException("Unexpected value: " + position);
} context.startActivity(intent);
}
});
}
@Override
public int getItemCount() { return items.size(); }
public void setupMediaPlayer(int resource) {main_mp = MediaPlayer.create(context, resource); main_mp.start();}
public void releaseMediaPlayer(){if (main_mp != null) { main_mp.stop(); main_mp.release(); main_mp = null; }}
public static class ViewHolder extends RecyclerView.ViewHolder { ImageView imageView; TextView textView;
public ViewHolder(@NonNull final View itemView) { super(itemView);
imageView = itemView.findViewById(R.id.titleImageView);
textView = itemView.findViewById(R.id.titleTextView); }
}
}
解决方案
没有经过真正的测试,但是,您可以尝试在声音停止播放时添加回调,如下所示:
public void setupMediaPlayer(int resource, Class<? extends Activity> activityClass) {
main_mp = MediaPlayer.create(context, resource);
main_mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
context.startActivity(new Intent(context, activityClass));
}
});
main_mp.start();
}
推荐阅读
- javascript - 检查单选按钮值的语法
- python - 请求模块的结果在空闲和代码之间是不同的
- python - 在 python 中的 Keras 中加载 MNIST 数据,使用 mnist.load_data() 正在做什么
- c++ - glTF文件中步幅的属性?
- jax-rs - JAX-RS 在 Liberty 上抛出 URISyntaxException
- c# - 如何使用 YamlDotNet 反序列化静态属性?
- python - “For循环”没有创建现有数据帧的修改副本
- python - 如何使共享一个类别的所有帖子出现在 Django 的页面上
- apache - 使用 mod_auth_openidc 和 keycloak 进行 cURL 身份验证
- regex - 使用正则表达式识别 EQUIPMENTID 编号 - VBA