2016-07-11 11 views
2

Ich implementiere meine eigene Version von VideoView. Die Klasse enthält einen Play-Pause-Button als ImageView, der die VideoView überlagert. Alles ist von einem FrameLayout verpackt. Um diese Klasse zu verwenden, rufe ich eine benutzerdefinierte Initialisierungsmethode auf, die die Klasse von ihrem übergeordneten Element entfernt, die FrameLayout und ImageView programmatisch erstellt und dann die VideoView und ImageView zu FrameLayout hinzufügt. Schließlich wird die FrameLayout zu dem Elternteil der VideoView als der ursprüngliche Index hinzugefügt. Das Problem besteht darin, dass die Ansicht für den Benutzer nicht sichtbar ist, obwohl ich feststellen kann, dass der Parent das FrameLayout beim Debuggen als untergeordnetes Element hat.Ich kann die View nicht sehen, nachdem ich sie FrameLayout programmatisch hinzugefügt habe

public class PodoVideoView extends VideoView { 

// boilerplate constructors removed 

// This method must be called to set the functionality of this class. 
// reasoning: cannot call getParent() from constructor 
public void init(Activity activity) { 

    // remove VideoView and save its index 
    ViewGroup parent = (ViewGroup) this.getParent(); 
    int indexInParent = parent.indexOfChild(this); 
    parent.removeView(this); 

    // setup layout 
    final FrameLayout videoViewLayout = new FrameLayout(activity); 
    videoViewLayout.setBackgroundColor(activity.getResources().getColor(R.color.black)); 
    videoViewLayout.setLayoutParams((new FrameLayout.LayoutParams(
      LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT))); 

    // add VideoView and play/pause ImageView to layout 
    videoViewLayout.addView(this); 
    final ImageView playPauseImageView = new ImageView(activity); 
    playPauseImageView.setImageResource(R.drawable.video_play); 
    videoViewLayout.addView(playPauseImageView); 

    // add layout to parent 
    parent.addView(videoViewLayout, indexInParent); 

    // play/pause UX 
    setOnPreparedListener(new OnPreparedListener() { 
     @Override 
     public void onPrepared(final MediaPlayer mp) { 
      setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        if(isPlaying()) { 
         playPauseImageView.setVisibility(View.VISIBLE); 
         mp.pause(); // if this doesn't work, use mp.pause() instead of pause() 
        } else { 
         playPauseImageView.setVisibility(View.INVISIBLE); 
         mp.start(); 
        } 
       } 
      }); 
     } 
    }); 

    setOnCompletionListener(new OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      playPauseImageView.setVisibility(View.VISIBLE); 
     } 
    }); 
} 
+0

Dieser Code OK aussieht. Welche Farbe hat dein 'video_play'' Drawable'? Bist du sicher, dass es nicht nur hineinpasst? Welche Art von ViewGroup ist der Elternteil? Eigentlich würde es helfen, das Layout-XML zu sehen. Auch einen bestimmten Grund, warum Sie dies nicht nur im Layout tun? –

Antwort

2

versuchen playPauseImageView.bringToFront(); und Sie sollten die Ansicht der LayoutParams gesetzt, wenn Sie es zu einem Viewgroup hinzufügen

FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); 
videoViewLayout.addView(playPauseImageView, layoutParams); 
playPauseImageView.bringToFront();