2014-01-23 16 views
7

Ich bin mit Blick Pager mit dem Fragmente zu zeigen, Bild und Video, ich bin in der Lage Bild und Video richtig zu zeigen, aber ich habe ein Problem, wenn ich für das Video Swipe, dann ist Video zu spielen, aber ich Wischen Sie als nächstes oder vorher, dann wird das Video immer noch auf dem nächsten oder vorherigen Bildschirm abgespielt, aber wenn ich zwei Folien vor oder zurück bewege, wird das Video angehalten, aber warum nicht auf der nächsten oder vorherigen Folie.Video pausiert nicht ViewPager in Fragmente

ich es mehr zu suchen, aber ich habe keine Lösung bekommen, wird jede Hilfe spürbar sein. Vielen Dank im Voraus.

Hier ist mein Code:

Dies ist Fragment Klasse

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; 
    } 
} 

Dies ist Pager Adapter Aktivität

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

kann mir jemand sagen, es ist die lösung? – Ankit

Antwort

9

Es ist, weil ViewPager hält offscreen Fragmente gestartet. Zum Beispiel haben Sie ein Fragment für den Benutzer sichtbar. ViewPager wird versuchen, das vorherige Fragment (auf der linken Seite) und das nächste Fragment (auf der rechten Seite) zu behalten. Dies ermöglicht ViewPager reibungsloses Gleiten, wenn Benutzer entscheidet, die Seite zu ändern, weil die nächste und die vorherigen Seiten bereits vorbereitet sind.

In Ihrem Fall ist der Videoplayer nicht sichtbar (Offscreen), aber ViewPager hält ihn aufgrund des oben beschriebenen Verhaltens an. Sie können die Methode setOffscreenPageLimit() verwenden, um dieses Verhalten zu ändern. Wenn Sie das Seitenlimit auf 0 festlegen, werden Offscreen-Fragmente sofort angehalten. Leider werden sie nicht nur pausiert, sondern auch gestoppt und von der Aktivität getrennt. Das heißt, wenn Sie zu Ihrem Fragment zurückkehren, wird das gesamte Layout neu erstellt. Deshalb können Sie versuchen, entweder Fragment.setUserVisibleHint() oder Fragment.onHiddenChanged() und führen Sie Ihre Pause/Play-Logik gibt außer Kraft zu setzen. ViewPager aktualisiert den versteckten Status eines Fragments in Abhängigkeit davon, ob das Fragment tatsächlich für den Benutzer sichtbar ist oder nicht.

Hoffe, das hilft.

+0

Dank beworker für Ihre Antwort, aber ich löste dieses Problem auf andere Weise wie Galerie-App in Android, ich bin nicht, dass Video-Ansicht direkt verwenden, ist es Thumbnail in Bild und eine nach Klick auf dieses Thumbnail-Video-Aufnahme wird abgespielt. aber ich werde deine Lösung versuchen. – Ankit

+1

Danke @beworker, es hat für mich funktioniert. – Umesh

4

Sie haben setUserVisibleHint Methode in einem Fragment außer Kraft zu setzen, wo u Video abspielen.

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

Wenn ich den Player stoppe/pausiere, habe ich eine illegale Ausnahme und benutze player.release(); Es stoppt den Player aber kann nicht für das nächste Video spielen oder wenn ich zurück –

+0

kann können Sie bitte Ihren Code posten. –

+0

Ich werde mein Problem als neue Frage hinzufügen, einen Blick dafür nehmen https://stackoverflow.com/questions/45052603/video-image-viewpager –

Verwandte Themen