Android Studio Java音频计时器实现与下拉选项跳转Activity问题
一、添加音频时长显示控件(已播放/剩余时长)
1. 在布局文件(activity_main2.xml)中添加时长显示TextView
添加两个TextView分别显示已播放时长和总时长(或剩余时长):
<TextView android:id="@+id/tv_current_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="00:00"/> <TextView android:id="@+id/tv_total_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="00:00"/> <!-- 可选:添加剩余时长TextView --> <TextView android:id="@+id/tv_remaining_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="-00:00"/>
2. 编写时间格式化工具方法
在播放Activity中添加毫秒转mm:ss格式的方法:
private String formatTime(long milliseconds) { int minutes = (int) (milliseconds / 1000) / 60; int seconds = (int) (milliseconds / 1000) % 60; return String.format("%02d:%02d", minutes, seconds); }
3. 关联音频与时长控件,实时更新
在Activity中声明TextView实例,并在TimerTask中同步更新(注意必须在UI线程操作控件):
// 新增TextView声明 private TextView tvCurrentTime; private TextView tvTotalTime; private TextView tvRemainingTime; // 如需显示剩余时长 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); // 初始化TextView tvCurrentTime = findViewById(R.id.tv_current_time); tvTotalTime = findViewById(R.id.tv_total_time); tvRemainingTime = findViewById(R.id.tv_remaining_time); mediaPlayer = MediaPlayer.create(this, R.raw.mixkit); // 初始化总时长显示 String totalTime = formatTime(mediaPlayer.getDuration()); tvTotalTime.setText(totalTime); // 原有SeekBar初始化代码... new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { final int currentPos = mediaPlayer.getCurrentPosition(); // 更新SeekBar seekbar.setProgress(currentPos); // 更新时长显示,必须在UI线程执行 runOnUiThread(new Runnable() { @Override public void run() { tvCurrentTime.setText(formatTime(currentPos)); // 计算并显示剩余时长 long remaining = mediaPlayer.getDuration() - currentPos; tvRemainingTime.setText("-" + formatTime(remaining)); } }); } }, 0, 500); // 原有SeekBar监听代码... }
二、实现Spinner选项对应音频播放/页面跳转
1. 定义选项与目标的映射关系
假设strings.xml中的time数组为:
<string-array name="time"> <item>5分钟</item> <item>10分钟</item> <item>15分钟</item> </string-array>
在Spinner所在Activity中定义对应资源或Activity类:
// 对应5、10、15分钟的音频资源ID private int[] audioResIds = {R.raw.audio5, R.raw.audio10, R.raw.audio15}; // 或者对应跳转的Activity类 private Class<?>[] targetActivities = {Activity5.class, Activity10.class, Activity15.class};
2. 在按钮点击时处理选中项
修改startButton的点击事件,根据Spinner选中位置执行对应逻辑:
startButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int selectedPos = spinner.getSelectedItemPosition(); // 方案1:跳转至播放Activity并传递音频ID Intent intent = new Intent(Main3Activity.this, Main2Activity.class); intent.putExtra("AUDIO_RES_ID", audioResIds[selectedPos]); startActivity(intent); // 方案2:直接跳转至对应时长的Activity // Intent intent = new Intent(Main3Activity.this, targetActivities[selectedPos]); // startActivity(intent); } });
3. 在播放Activity中接收音频ID(方案1需执行)
修改播放Activity的onCreate方法,根据传递的ID初始化MediaPlayer:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); // 获取传递的音频ID,默认使用原音频 int audioResId = getIntent().getIntExtra("AUDIO_RES_ID", R.raw.mixkit); mediaPlayer = MediaPlayer.create(this, audioResId); // 后续SeekBar、时长显示初始化代码... }
内容的提问来源于stack exchange,提问作者chiwi.chiwi
相关产品推荐
相关产品推荐

