ViewPager2不破坏片段

用户名

我有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我的片段,并设置断点在那里,但是当驳回对话框断点从来不叫,也不是onPauseonDetach

这是否还意味着在ExoPlayer关闭对话框时该实例仍处于活动状态?

取消对话框后,如何停止视频的音频?

安德鲁

我不在另一个Fragment中使用viewpager2,但根据文档和viewpager2的源代码,我认为您从Fragment执行适配器时创建的适配器不正确。

class LightboxFragment尝试换线

myViewPagerAdapter = new MyViewPagerAdapter(getActivity());

myViewPagerAdapter = new MyViewPagerAdapter(this);

这是因为基于文档https://developer.android.com/reference/androidx/viewpager2/adapter/FragmentStateAdapter#FragmentStateAdapter(androidx.fragment.app.Fragment)

片段:如果ViewPager2直接位于Fragment子类中。

您正在使用它,就像Viewpager2直接在宿主活动中一样。

这意味着您将LightboxVideoFragment与FragmentManager相同,LightboxFragment并且生命周期更改LightboxFragment不会影响基本上是它的兄弟姐妹(而不是子级)

如果您也查看viewpager2的构造函数的源代码

https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java#102

正确的构造函数将viewpager2适配器中的Fragment通过主机FragmentgetChildFragmentManager()和Fragment的生命周期而不是Activity's生命周期进行绑定。

(我还没有尝试或测试过这些来自文档和阅读源代码的知识)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

选择的EditText当ViewPager2改变片段

来自分类Dev

带Viewpager2的键FragmentStateAdapter的片段不再存在

来自分类Dev

来自viewpager2和我的父片段的SharedViewModel

来自分类Dev

如何在片段中嵌套ViewPager2

来自分类Dev

如何在ViewPager2中获取当前片段

来自分类Dev

确定何时片段在ViewPager2中不再可见

来自分类Dev

从Viewpager2片段访问Parent的Fragment函数

来自分类Dev

ViewPager2的OnTouchListener

来自分类Dev

嵌套的viewpager2

来自分类Dev

片段中的ViewPager2在被导航组件Navigation替换它所在的片段后泄漏

来自分类Dev

Android ViewPager2具有不同的片段:错误->始终显示相同的片段

来自分类Dev

ViewPager不滚动片段

来自分类Dev

带有Viewpager2片段的实时数据

来自分类Dev

使用jetpack从ViewPager2导航到另一个片段

来自分类Dev

Viewpager2打开所选页面(从cardview)没有片段

来自分类Dev

导航抽屉+ ViewPager +片段,ViewPager不会破坏嵌套的片段

来自分类Dev

ViewPager内部的片段不会被破坏

来自分类Dev

将ViewPager2打开到特定位置而不滚动

来自分类Dev

ViewPager不更新片段

来自分类Dev

即使offsetlimit为默认值(0),ViewPager2也会展开下一个片段

来自分类Dev

ViewPager2堆栈PageTransform

来自分类Dev

在viewpager2中禁用动画

来自分类Dev

Google Map + ViewPager2滑动冲突

来自分类Dev

ViewPager2闪烁/重新加载

来自分类Dev

Viewpager2 占据全屏的约束布局

来自分类Dev

将片段添加到ViewPager时,活动已被破坏

来自分类Dev

ViewPager 不更新添加的片段

来自分类Dev

ViewPager2 /标签问题视图模型状态

来自分类Dev

为什么FragmentStateAdapter在ViewPager2中不起作用?

Related 相关文章

热门标签

归档