【发布时间】:2020-11-08 06:23:40
【问题描述】:
我正在尝试从每个 ViewPager 页面访问单个媒体播放器实例。但是每个页面都会创建自己的媒体播放器。我该如何解决这个问题?
我已经在主要活动中声明了一个公共 Mediaplayer 对象。
public MediaPlayer mediaPlayer;
并将其引用发送到 ViewPagerAdapter
protected void onCreate(Bundle savedInstanceState) {
//Many code lines
viewPagerAdapter=new ViewPagerAdapter(getSupportFragmentManager(),this,0,data,mediaPlayer);
}
在 viewpager 适配器中,我在创建每个页面的位置再次传递 mediaplayer 引用
@NonNull
@Override
public Fragment getItem(int position) {
page pg= new page(mediaPlayer);
Bundle bundle=new Bundle();
bundle.putStringArray("array",data.get(position));
bundle.putString("title",mData[position]);
pg.setArguments(bundle);
return pg;
}
然后在每个页面上我都有一个回收器视图,所以我为它创建了一个适配器并再次传递媒体播放器实例
recyclerViewAdapter=new RecyclerViewAdapter(this.getContext(),data,mediaPlayer);
现在每个页面上都有几个按钮。每个按钮播放不同的音乐
holder.btn_clk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try{
mediaPlayer.release();
Log.e("MP","Released.");
}catch (Exception e){
Log.e("MP","Released Error.");
}
mediaPlayer= MediaPlayer.create(mContext, file);
mediaPlayer.start();
}
});
除了媒体播放器参考之外,一切正常。
似乎每个页面都创建了自己的媒体播放器实例。如果我在同一页面上按 2 个不同的按钮,则只会播放最新的音乐。但是,如果我在 2 个不同的页面上按 2 个不同的按钮,则两种音乐都在播放。
我的主要目标是添加一个通用浮动操作按钮,它将充当每个媒体播放器实例的停止按钮。 所以我在 viewpager 所在的 mainactivity 布局上添加了一个。
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pager"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:layout_margin="@dimen/fab_margin"
android:clickable="true"
app:backgroundTint="@color/orange_500"
android:src="@drawable/ic_baseline_music_off_24"
android:visibility="visible" />
</FrameLayout>
我怎样才能做到这一点?
【问题讨论】:
标签: android android-viewpager android-mediaplayer floating-action-button