我有DialogFragment
一个ViewPager2
:
public class LightboxFragment extends DialogFragment {
private ViewPager2 viewPager;
private MyViewPagerAdapter myViewPagerAdapter;
public static LightboxFragment newInstance() {
LightboxFragment fragment = new LightboxFragment();
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_lightbox, container, false);
viewPager = v.findViewById(R.id.viewPager);
FrameLayout closeButtonContainer = v.findViewById(R.id.close_button_container);
closeButtonContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
myViewPagerAdapter = new MyViewPagerAdapter(getActivity());
viewPager.setAdapter(myViewPagerAdapter);
return v;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public class MyViewPagerAdapter extends FragmentStateAdapter {
public MyViewPagerAdapter(FragmentActivity fa) {
super(fa);
}
@NonNull
@Override
public Fragment createFragment(int position) {
LightboxVideoFragment fragment = new LightboxVideoFragment();
return fragment;
}
@Override
public int getItemCount() {
return items.size();
}
}
}
我LightboxVideoFragment
看起来像这样:
public class LightboxVideoFragment extends Fragment {
private SimpleExoPlayer exoPlayer;
private PlayerView playerView;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.slideshow_video, container, false);
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
playerView = view.findViewById(R.id.player_view);
MediaItem mediaItem = MediaItem.fromUri(media.getUrls().getMp4());
exoPlayer = new SimpleExoPlayer.Builder(getContext()).build();
exoPlayer.setRepeatMode(Player.REPEAT_MODE_ALL);
playerView.setPlayer(exoPlayer);
exoPlayer.setMediaItem(mediaItem);
exoPlayer.prepare();
exoPlayer.play();
}
@Override
public void onResume() {
super.onResume();
if (exoPlayer != null) {
exoPlayer.play();
}
}
@Override
public void onPause() {
super.onPause();
if (exoPlayer != null) {
exoPlayer.pause();
}
}
@Override
public void onDetach() {
super.onDetach();
if (exoPlayer != null) {
exoPlayer.release();
}
}
}
我的问题是:关闭时DialogFragment
,片段视频中的音频仍在播放。为什么是这样?我试着将onDestroy
我的片段,并设置断点在那里,但是当驳回对话框断点从来不叫,也不是onPause
或onDetach
。
这是否还意味着在ExoPlayer
关闭对话框时该实例仍处于活动状态?
取消对话框后,如何停止视频的音频?
我不在另一个Fragment中使用viewpager2,但根据文档和viewpager2的源代码,我认为您从Fragment执行适配器时创建的适配器不正确。
在class LightboxFragment
尝试换线
myViewPagerAdapter = new MyViewPagerAdapter(getActivity());
至
myViewPagerAdapter = new MyViewPagerAdapter(this);
片段:如果ViewPager2直接位于Fragment子类中。
您正在使用它,就像Viewpager2直接在宿主活动中一样。
这意味着您将LightboxVideoFragment
与FragmentManager相同,LightboxFragment
并且生命周期更改LightboxFragment
不会影响基本上是它的兄弟姐妹(而不是子级)
如果您也查看viewpager2的构造函数的源代码
正确的构造函数将viewpager2适配器中的Fragment通过主机FragmentgetChildFragmentManager()
和Fragment的生命周期而不是Activity's
生命周期进行绑定。
(我还没有尝试或测试过这些来自文档和阅读源代码的知识)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句