Positionnement MediaController – lier à VideoView

Il y a eu beaucoup de discussions sur la façon de positionner un MediaController et la plupart des réponses sont d'utiliser la setAnchorView setAnchorView. Au premier coup d'œil, cette solution semble fonctionner, mais dans mon cas, elle ne l'est pas.

Selon cette publication, setAnchorView agit uniquement comme référence pour le positionnement initial du MediaController , mais crée en fait une nouvelle Window flottante.

  • Erreur "Impossible de trouver une bibliothèque native" dans l'application Native Activity
  • Comment changer la couleur d'un ProgressBar indéfini?
  • Phonegap Android et satellite GPS
  • Passez Android NestedScrollView passe les balises horizontales vers une vue parentale
  • Comparaison de Layer, Applozic, Quickblox et SendBird pour WhatsApp rapide comme une messagerie dans une application Android
  • RecyclerView onBindViewHolder uniquement appelé quand getItemViewType change
  • Donc, ce que je veux, c'est un MediaController qui est vraiment lié à une View parent (p. Ex. VideoView).

    Par exemple, si vous avez un LinearLayout dans une ScrollView et vous devez faire défiler vers le bas vers votre VideoView où le MediaController est attaché, MediaController devrait vraiment être attaché à cette VideoView afin que MediaController défile avec VideoView .

    Un autre cas d'utilisation où ce problème est abordé ici , où le MediaController est utilisé dans un ViewPager .

    Alors, comment réaliser un tel comportement pour un MediaController ?

  • Utilisation correcte de sous-fragments avec (Child) FragmentManager
  • Différence entre android.R.layout.simple_spinner_dropdown_item et android.R.layout.simple_spinner_item
  • La connexion à adb est désactivée et une erreur grave s'est produite. Vous devez redémarrer AdB et Eclipse. Assurez-vous que l'AdB est correctement situé
  • Comment puis-je obtenir un élément de menu dans NavigationView?
  • Détecter l'android de mon application: versionCode au moment de l'exécution
  • Le focus de la demande EditText ne fonctionne pas
  • 3 Solutions collect form web for “Positionnement MediaController – lier à VideoView”

    J'ai fini par faire un hack sale … Je viens de videoView manuellement la vue à mon videoView pour obtenir le comportement recherché:

     public void onPrepared(MediaPlayer mp) { MediaController mc = new MediaController(videoView.getContext(), false); // set correct height RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) videoView.getLayoutParams(); params.height = mp.getVideoHeight(); videoView.setLayoutParams(params); videoView.setMediaController(mc); pBar.setVisibility(View.GONE); mc.show(0); FrameLayout f = (FrameLayout) mc.getParent(); RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); lp.addRule(RelativeLayout.ALIGN_BOTTOM, videoView.getId()); ((LinearLayout) f.getParent()).removeView(f); ((RelativeLayout) videoView.getParent()).addView(f, lp); mc.setAnchorView(videoView); } 

    Le problème avec cette solution est que le réglage de l'ancrageView n'a aucun effet et, par conséquent, le fait de taper sur VideoView ne cache pas ou ne montre pas le MediaController tel qu'il est supposé.

    Il est certainement une solution beaucoup mieux et j'espère que quelqu'un peut me donner un indice!

    Je voulais simplement ajouter à la réponse de DERIIIFranz. J'ai utilisé la même méthode pour attribuer le contrôleur multimédia à la vue que je voulais et pour que les fonctions Hide () et Show () fonctionnent correctement. J'ai simplement fait ma propre classe MediaController et surréfié les méthodes Hide () et Show (). Comme la propriété isShowing (je fais cela en C # avec Xamarin, donc je ne sais pas les problèmes que vous auriez avec Java).

    J'ai également ajouté mon propre écouteur de clics sur VideoView pour m'assurer que je pouvais gérer les évènements Hide () and Show ().

     public class MyMediaController : MediaController { private bool _isShowing { get; set; } = false; public override bool IsShowing { get { return _isShowing; } } public override void Show () { base.Show(); _isShowing = true; Native.ViewGroup parent = ((Native.ViewGroup)this.Parent); parent.Visibility = Native.ViewStates.Visible; } public override void Hide () { base.Hide(); _isShowing = false; Native.ViewGroup parent = ((Native.ViewGroup)this.Parent); parent.Visibility = Native.ViewStates.Gone; } } 

    Pour convertir la réponse de Jonathan Hockman à Java et l'ajouter à la réponse de DERIIIFranz:

     public class MyMediaController extends MediaController { public MyMediaController(Context context) { super(context); } public MyMediaController(Context context, boolean useFastForward) { super (context, useFastForward); } public MyMediaController(Context context, AttributeSet attrs) { super(context, attrs); } private boolean _isShowing = false; @Override public boolean isShowing() { return _isShowing; } @Override public void show() { super.show(); _isShowing = true; ViewGroup parent = (ViewGroup) this.getParent(); parent.setVisibility(View.VISIBLE); } @Override public void hide() { super.hide(); _isShowing = false; ViewGroup parent = (ViewGroup) this.getParent(); parent.setVisibility(View.GONE); } } 

    Pour la videoView:

      public void onPrepared(MediaPlayer mediaPlayer) { MyMediaController mediaController = new MyMediaController(videoView.getContext(), false); RelativeLayout parentLayout = (RelativeLayout) videoView.getParent(); RelativeLayout.LayoutParams parentParams = (RelativeLayout.LayoutParams) parentLayout.getLayoutParams(); parentParams.height = this.getHeight(); parentLayout.setLayoutParams(parentParams); FrameLayout frameLayout = (FrameLayout) mediaController.getParent(); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, this.getId()); ((LinearLayout)frameLayout.getParent()).removeView(frameLayout); parentLayout.addView(frameLayout, layoutParams); mediaController.setAnchorView(this); mediaController.hide(); videoView.setMediaController(mediaController); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.