android - Android:从下拉菜单中选择歌曲并使用 MediaPlayer 播放歌曲
问题描述
有没有办法从下拉列表中选择一首歌曲并使用媒体播放器播放?
现在我使用:
mediaPlayer = MediaPlayer.create(this, R.raw.song1);
在 initViews() 方法中。
我需要知道的是我可以做这样的事情:
if spinner.getselectedItem().toString().equals("song1"){
mediaPlayer = MediaPlayer.create(this, R.raw.song1);
} else{
mediaPlayer = MediaPlayer.create(this, R.raw.song2);
下面的代码:
public class MainActivity extends Activity implements AdapterView.OnItemSelectedListener {
private Button buttonPlayStop;
private MediaPlayer mediaPlayer;
private SeekBar seekBar;
private final Handler handler = new Handler();
// Here i override onCreate method.
//
// setContentView() method set the layout that you will see then
// the application will starts
//
// initViews() method i create to init views components.
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_main);
initViews();
}
// This method set the setOnClickListener and method for it (buttonClick())
@SuppressLint("ClickableViewAccessibility")
private void initViews() {
buttonPlayStop = findViewById(R.id.ButtonPlayStop);
buttonPlayStop.setOnClickListener(new OnClickListener() {@Override public void onClick(View v) {buttonClick();}});
Spinner spinner = findViewById(R.id.spinner);
if (spinner.getSelectedItem().toString().equals("song1")){
mediaPlayer = MediaPlayer.create(this, R.raw.song1);
} else {
mediaPlayer = MediaPlayer.create(this, R.raw.song2);
}
// Spinner click listener
spinner.setOnItemSelectedListener(this);
// Spinner Drop down elements
List<String> categories = new ArrayList<String>();
categories.add("song1");
categories.add("song2");
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, categories);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// attaching data adapter to spinner
spinner.setAdapter(dataAdapter);
seekBar = findViewById(R.id.SeekBar01);
seekBar.setMax(mediaPlayer.getDuration());
seekBar.setOnTouchListener(new OnTouchListener() {@Override public boolean onTouch(View v, MotionEvent event) {
seekChange(v);
return false; }
});
}
public void startPlayProgressUpdater() {
seekBar.setProgress(mediaPlayer.getCurrentPosition());
if (mediaPlayer.isPlaying()) {
Runnable notification = new Runnable() {
public void run() {
startPlayProgressUpdater();
}
};
handler.postDelayed(notification,1000);
}else{
mediaPlayer.pause();
buttonPlayStop.setText(getString(R.string.play_str));
seekBar.setProgress(0);
}
}
// This is event handler thumb moving event
private void seekChange(View v){
if(mediaPlayer.isPlaying()){
SeekBar sb = (SeekBar)v;
mediaPlayer.seekTo(sb.getProgress());
}
}
// This is event handler for buttonClick event
private void buttonClick(){
if (buttonPlayStop.getText() == getString(R.string.play_str)) {
buttonPlayStop.setText(getString(R.string.pause_str));
try{
mediaPlayer.start();
mediaPlayer.setLooping(true);
startPlayProgressUpdater();
}catch (IllegalStateException e) {
mediaPlayer.pause();
mediaPlayer.setLooping(false);
}
}else {
buttonPlayStop.setText(getString(R.string.play_str));
mediaPlayer.pause();
}
}
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
// On selecting a spinner item
String item = adapterView.getItemAtPosition(i).toString();
// Showing selected spinner item
Toast.makeText(adapterView.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}
谢谢您的帮助!
解决方案
像这样改变你的onItemSelected
方法:
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
// On selecting a spinner item
String item = adapterView.getItemAtPosition(i).toString();
// Showing selected spinner item
Toast.makeText(adapterView.getContext(), "Selected: " +item, Toast.LENGTH_LONG).show();
if (item.equals("song1")){
mediaPlayer = MediaPlayer.create(this, R.raw.song1);
} else {
mediaPlayer = MediaPlayer.create(this, R.raw.song2);
}
}
推荐阅读
- docker - 无法在远程服务器上的 Docker 容器上启动 GUI 程序
- google-cloud-platform - 在 GKE 上为 Hashicorp Vault 配置插件目录
- angular - 为什么 Angular 8 所需的验证与 ngValue 的行为不同?
- node.js - nginx 位置未正确加载
- c# - C#在鼠标移动时隐藏工具提示并在鼠标悬停时再次显示它而不离开控制
- android - 检查地图上的标记是否已被删除 - Android
- r - 为什么 dplyr 过滤器没有捕获 NA
- javascript - 从 wordpress 网页创建可下载的 PDF
- windows - pthread_cond_wait 的 Win32 等效 API
- ruby - Sprintf 浮点数行为从 Ruby 2.3 更改为 2.4