2014-01-23 123 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 –