【发布时间】:2015-06-09 21:41:49
【问题描述】:
我是 Android 开发新手,我从一个简单的音板应用程序开始。我开始使用多个片段开发音板,直到我意识到我正在使用多个 MediaPlayer 实例。这不好,因为我希望一次只播放一种声音。
我意识到我必须使用 MediaPlayer Singleton 来解决我的问题。唯一的问题是我在网上找不到很多 MediaPlayer Singleton 的来源或示例。
这是我最初放入每个片段中每个“onCreateView”的内容:
public static class FragmentPage1 extends Fragment {
int selectedSoundId;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_page1, container, false);
final MediaPlayer player = new MediaPlayer();
final Resources res = getResources();
final int[] buttonIds = { R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4, R.id.btn5, R.id.btn6, R.id.btn7, R.id.btn8, R.id.btn9 };
final 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 };
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < buttonIds.length; i++) {
if (v.getId() == buttonIds[i]) {
selectedSoundId = soundIds[i];
AssetFileDescriptor afd = res.openRawResourceFd(soundIds[i]);
player.reset();
try {
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
player.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
player.start();
break;
}
}
}
};
for (int i = 0; i < buttonIds.length; i++) {
ImageButton soundButton = (ImageButton) rootView.findViewById(buttonIds[i]);
registerForContextMenu(soundButton);
soundButton.setOnClickListener(listener);
}
return rootView;
}
}
据我所知,我可能会将 onClickListener 放在每个片段中,并将 MediaPlayer Singleton 放在一个新的 Java 类中。不过我不知道从那里做什么。
如何实现 MediaPlayer Singleton 以及如何在片段的“onCreateView”方法中调用它?
非常感谢您的示例!
【问题讨论】:
标签: java android android-fragments media-player android-mediaplayer