视频没有在片段 ViewPager 中暂停

Posted

技术标签:

【中文标题】视频没有在片段 ViewPager 中暂停【英文标题】:Video is not pausing in fragment ViewPager 【发布时间】:2014-02-13 14:53:41 【问题描述】:

我正在使用带有片段的 View Pager 来显示图像和视频,我能够正确显示图像和视频但我有问题,当我滑动视频时,视频正在播放,但我滑动下一个或上一个然后视频是仍在下一个或上一个屏幕上播放,但是当我将两张幻灯片移动到下一个或上一个时,视频将停止,但为什么不在下一个或上一个幻灯片上播放。

我搜索了更多,但没有得到任何解决方案,任何帮助都会很明显。 提前致谢。

这是我的代码:

这是片段类

public class ContentFragment extends Fragment 
    private final String imageResourceId;
    private String type;


    public ContentFragment(String imageResourceId,String type) 
        System.out.println("Path In cons="+imageResourceId+"and type is="+type);
        this.imageResourceId = imageResourceId;
        this.type= type;
    


    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        Log.e("Test", "hello");
    

    @Override
    public void onActivityCreated(Bundle savedInstanceState) 
        super.onActivityCreated(savedInstanceState);

    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 

        View view = inflater.inflate(R.layout.content_layout, container, false);

        TouchImageView imageView = (TouchImageView) view.findViewById(R.id.touchImage);
        imageView.setImageResource(R.id.touchImage);
        imageView.setMaxZoom(10f);
        VideoView videoView =(VideoView) view.findViewById(R.id.videoView1);

        if(type.equals("image")) 
            imageView.invalidate();

            imageView.setVisibility(View.VISIBLE);
            videoView.setVisibility(View.GONE);

            try 
                System.out.println("IN Content Fragment"+imageResourceId.toString());

                Bitmap bmp = BitmapFactory.decodeFile(imageResourceId.toString());
                imageView.setImageBitmap(bmp);

             catch(Exception e) 
                System.out.println("Error Of image File"+e);
            


         else  
        try 
        if(type.equals("video"))
            videoView.invalidate();
            videoView.setVisibility(View.VISIBLE);
            imageView.setVisibility(View.GONE);

            String path = imageResourceId.toString();
            videoView.setVideoURI(Uri.parse(path));
                videoView.setMediaController(new MediaController(getActivity()));
                videoView.setFocusable(true);
                videoView.start();
            
         catch(Exception e) 
        e.printStackTrace();
        

        return view;
    

这是寻呼机适配器活动

public class MediaActivity extends FragmentActivity 

     private MyAdapter mAdapter;
        private ViewPager mPager;


       public ArrayList<Content> contentList;
     Context context;
        LinearLayout numberOfPageLayout;
     SharedPreferences sharedPreferences;
     Handler progressHandler;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_media);
            context=(Context) getApplicationContext();                           
                    mPager = (ViewPager) findViewById(R.id.pager);
            progressHandler = new Handler();
            contentList=new ArrayList<Content>();
                new AsyncTask<Void, Void, Void>() 

                    @Override
                    protected Void doInBackground(Void... params) 
                        // TODO Auto-generated method stub
                        contentList=new ContentDBAdapter(context).getAllContent();

                                   
                        return null;
                    
                    @Override
                    protected void onPostExecute(Void result) 
                        // TODO Auto-generated method stub
                        super.onPostExecute(result);
                        mAdapter = new MyAdapter(getSupportFragmentManager(),contentList);
                        mPager.setAdapter(mAdapter);
                    
                .execute();




            mPager.setOnPageChangeListener(new OnPageChangeListener() 

                @Override
                public void onPageSelected(int arg0) 
                    // TODO Auto-generated method stub

                

                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
                    // TODO Auto-generated method stub


                

                @Override
                public void onPageScrollStateChanged(int arg0) 
                    // TODO Auto-generated method stub

                
            );
        


        public static class MyAdapter extends FragmentPagerAdapter 
            ArrayList <Content>contList=new ArrayList<Content>();
            public MyAdapter(FragmentManager fm,ArrayList<Content> cont) 
                super(fm);
                this.contList=cont;
            

            @Override
            public int getCount() 
                totalPage=contList.size();
                return contList.size();
            

            @Override
            public Fragment getItem(int position) 

                Content con=contList.get(position);

                return new ContentFragment(con.getPath(),con.getType());

            
        


【问题讨论】:

谁能告诉我这是解决方案吗? 【参考方案1】:

这是因为ViewPager 保持屏幕外片段启动。例如,您有一个对用户可见的片段。 ViewPager 将尝试保持前一个片段(左侧)和下一个片段(右侧)开始。这允许ViewPager 在用户决定更改页面时执行平滑滑动,因为已经准备好下一页和上一页。

在您的情况下,视频播放器不可见(屏幕外),但由于上述行为,ViewPager 使其保持启动。您可以使用setOffscreenPageLimit() 方法来更改此行为。如果您将页面限制设置为0,则屏幕外片段将立即暂停。不幸的是,它们不仅会被暂停,还会停止并脱离活动。这意味着当您返回片段时,它将重新创建整个布局。这就是为什么您可以尝试覆盖Fragment.setUserVisibleHint()Fragment.onHiddenChanged() 并在那里执行暂停/播放逻辑的原因。 ViewPager 将根据片段是否对用户实际可见来更新片段的隐藏状态。

希望这会有所帮助。

【讨论】:

感谢beworker的回答,但我以另一种方式解决了这个问题,就像android中的画廊应用程序一样,我没有直接使用该视频视图,而是在图像视图中获取缩略图,然后单击该缩略图视频将播放。但我会试试你的解决方案。【参考方案2】:

您必须在播放视频的片段中覆盖 setUserVisibleHint 方法。

public void setUserVisibleHint(boolean isVisibleToUser)        
    super.setUserVisibleHint(isVisibleToUser);                         
     if (this.isVisible())
                    
        if (!isVisibleToUser)   // If we are becoming invisible, then...
          
          //pause or stop video
        

        if (isVisibleToUser) 
                                       
            //play your video               
        

    

  

【讨论】:

当我停止/暂停播放器时出现非法异常以及当我使用 player.release();它会停止播放器但无法播放下一个视频或当我返回时 我会将我的问题添加为新问题,可以查看***.com/questions/45052603/video-image-viewpager【参考方案3】:

我这样处理问题:

boolean isVisible = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) 

    isVisible = isVisibleToUser;
        if(player!=null)
            player.pause();       
    super.setUserVisibleHint(isVisibleToUser);

然后在 onCreateView 方法中:

SimpleExoPlayer player;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 

    View v = inflater.inflate(R.layout.fragment_screen_slide_page, container, false);
    PlayerView playerView = v.findViewById(R.id.playerView);
    playerView.getLayoutParams().width = ListPager.widthPixels;
    playerView.getLayoutParams().height = ListPager.widthPixels;
    if(player!=null)
         player.release();
    player = new SimpleExoPlayer.Builder(App.applicationContext).build();               
    playerView.setPlayer(player);
    MediaItem mediaItem = MediaItem.fromUri(url);
    player.setMediaItem(mediaItem);
    player.prepare();

    //---------The following code is important because if you remove the following if
    // then if the next page is displaying, android will automatically initiate the
    // previous and the next page, and the player will start playing :| 

    if(isVisible)
      player.play();
 

【讨论】:

以上是关于视频没有在片段 ViewPager 中暂停的主要内容,如果未能解决你的问题,请参考以下文章

在渲染之前触发ViewPager片段内嵌套片段的动画

ViewPager 没有在滚动时剪辑 VideoView

在 ViewPager 和 Recyclerview 中自动播放视频,如 instagram

在tablayout viewpager中运行调整选项卡片段

隐藏在标签栏后面的 View Pager 的片段

IllegalArgumentException: No view found for id for fragment --- ViewPager in ViewPager