2014-01-23 124 views
7

我正在使用视图寻呼机与片段来显示图像和视频,我能够正常显示图像和视频,但我有问题,当我刷视频,然后视频播放,但我然后滑动下一个或上一个视频,然后视频仍然只在下一个或上一个屏幕上播放,但是当我移动下一个或上一个两个幻灯片时,视频正在停止,但为什么不在下一张或上一张幻灯片中。视频不在片段中暂停ViewPager

我搜索了更多,但我没有得到任何解决方案,任何帮助将是可观的。 在此先感谢。

这里是我的代码:

这是片段级

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()); 

      } 
     } 

} 
+0

有人可以告诉我它的解决方案吗? – Ankit

回答

9

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

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

希望这会有所帮助。

+0

感谢beworker为你的答案,但我以另一种方式解决了这个问题,就像android中的图库应用程序,我没有直接使用视频视图,它在图像视图中缩略图,点击后,缩略图视频将播放。但我会尝试你的解决方案。 – Ankit

+1

谢谢@beworker,它为我工作。 – Umesh

4

你必须在播放视频的片段中覆盖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    
     } 

    } 

    } 
+0

当我停止/暂停播放器我有非法异常,当我使用player.release();它停止播放器,但不能播放下一个视频或当我回来 –

+0

可以请你张贴你的代码。 –

+0

我会将我的问题添加为新问题,可以查看它 https://stackoverflow.com/questions/45052603/video-image-viewpager –