0
votes

pourquoi je ne peux pas accéder à mes codes à l'intérieur de "sur l'auditeur préparé" dans "sur l'écouteur de clic" dans le fragment pour couper ma vidéo?

Je suis nouveau dans Android et j'ai eu un problème en désactivant ma vidéo dans OnClickListener dans fragment. J'utilise 3 fragments dynamiques différents. mon deuxième fragment doit lire une vidéo. J'ai un bouton muet dans ce fragment pour rendre ma vidéo muette et réactiver après que j'appuie dessus à nouveau. J'utilise OnPreparedListener dans mon Button OnClickListener, mais il ne fait absolument rien sans aucune erreur !! étonnamment, cela fonctionne bien lorsque je l'utilise en dehors de mon Button OnClickListener. alors pourquoi c'est arrivé et comment puis-je l'utiliser dans OnClickListener?

voici mon code MainActivity

public class SecondFragment extends Fragment {


private OnSecondFragmentInteractionListener onSecondFragInteaction;
private View view;
private ImageButton ibntMuteSecFrag;
private VideoView videoViewMain;
private AudioManager audio;
private float videoVolume;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.fragment_second, container, false);

        ibntMuteSecFrag = view.findViewById(R.id.ibtn_mute_second_frag);
        videoViewMain =  view.findViewById(R.id.vdvw_main_clip);

        audio = (AudioManager) 
        getActivity().getSystemService(Context.AUDIO_SERVICE);

        String videoPath = "android.resource://" + 
        getActivity().getPackageName() + "/" + R.raw.my_wedding_main_video;
        videoViewMain.setVideoPath(videoPath);
        videoViewMain.start();

        ibntMuteSecFrag.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onIbntMuteSecFragListener();
            }
        });

    return view;
}



public void onIbntMuteSecFragListener() {

    if (flagIsMuteBtnPress)
        videoVolume = 0;
    else
        videoVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);

    videoViewMain.setOnPreparedListener(new 
    MediaPlayer.OnPreparedListener() {
        public void onPrepared(MediaPlayer mp) {
        // compiler never get here, I use Log.d and notice that
                mp.setVolume(videoVolume, videoVolume);
        }
    });
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof 
    SecondFragment.OnSecondFragmentInteractionListener) {
        onSecondFragInteaction = 
    (SecondFragment.OnSecondFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    onSecondFragInteaction = null;
}

public interface OnSecondFragmentInteractionListener {
    void onVideoCompletListenerIntaction();
}

et voici mon fragment vidéo

public class MainActivity extends AppCompatActivity implements FirstFragment.OnFirstFragmentInteractionListener , SecondFragment.OnSecondFragmentInteractionListener , ThirdFragment.OnLastFragmentInteractionListener {

private android.support.v4.app.FragmentManager fragmentManager;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // first transaction for my first fragment
    fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = 
    fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.main_frame, new FirstFragment());
    fragmentTransaction.commit();
}

@Override
public void onFirstFragmentInteraction(Fragment a) {// it make a
//transaction after I finish my first fragment to second fragment I do not
//copy the first fragment codes for brief
    FragmentTransaction newTransaction = 
    fragmentManager.beginTransaction();
    newTransaction.replace(R.id.main_frame, new SecondFragment());
    newTransaction.commit();
    if(a != null)
        newTransaction.remove(a); // I use "a" to passes first fragment 
        // to remove it here
}

@Override
public void onVideoCompletListenerIntaction() { // it happened when
// my second fragment video finished and it work well
    FragmentTransaction newTransaction = 
    fragmentManager.beginTransaction();
    newTransaction.replace(R.id.main_frame, new ThirdFragment());
    newTransaction.commit();
}


0 commentaires

3 Réponses :


0
votes

essayez

SecondFragment.this.onIbntMuteSecFragListener();

c'est parce que vous êtes en fait dans la classe anonyme View.OnclickListener () et que cette instance n'implémente pas la méthode que vous essayez d'atteindre à partir de cette portée externe de Fragment ...


1 commentaires

Je fais ceci "SecondFragment.this.onIbntMuteSecFragListener ();" mais ne fonctionne toujours pas. pourriez-vous s'il vous plaît m'expliquer davantage sur votre solution parce que j'épais le problème pourrait causer quelque chose comme ça.



0
votes

Vous avez défini MediaPlayer.OnPreparedListener () trop tard. Si je comprends bien, vous commencez à lire la vidéo avant de définir l'auditeur. Ainsi, lorsque l'auditeur a été défini, le joueur "Préparer l'événement" est déjà passé.

Tout d'abord, vous devez définir l'auditeur et ensuite seulement commencer la lecture de la vidéo. Dans ce cas, l'auditeur sera déclenché.


10 commentaires

l'événement muet est un événement qui peut se produire ou non, mais la lecture de la vidéo est la raison de ce fragment et avec le début du second fragment, il doit commencer, alors comment puis-je définir l'auditeur en premier?


Vous devez définir l'auditeur avant d'appeler cette méthode videoViewMain.start (); Mais dans ce cas, vous ne pourrez pas régler le volume avec votre solution actuelle. Vous devez avoir une référence à mediaPlayerCheck. Consultez cette question pour savoir comment obtenir une référence à mediaPlayer. . Comme je le vois, ce n'est pas non plus une bonne solution, mais au moins cela devrait fonctionner.


Je change mon code et je règle l'écouteur avant d'appeler videoViewMain.start (); mais cela ne fonctionne toujours pas :(


Désolé, c'est de ma faute. Selon le diagramme du cycle de vie de mediaPlayer, nous devons définir l'auditeur avant videoViewMain.setVideoPath (videoPath);


Je le fais mais en notant toujours: (((


L'écouteur n'est pas appelé ou le bouton de mise en sourdine ne fonctionne pas?


Préparez l'écouteur dans votre écouteur de clics ne sera pas appelé. Vous définissez l'écouteur à chaque fois que l'utilisateur clique sur le bouton. Mais parce que l'événement est déjà passé, le processus d'écoute de préparation n'est pas appelé. Il ne sera appelé que si vous réinitialisez le chemin vidéo et redémarrez le lecteur.


l'auditeur est appelé et le bouton fonctionne bien avec d'autres choses programmées pour faire, comme changer la face du bouton ou faire en sorte que le bouton appuie sur les drapeaux, je ne copie pas le code d'un autre bouton pour bref, le problème seulement est que le fil ne peut pas atteindre à l'intérieur d'OnPrepared pour régler le volume vidéo. mais lorsque j'utilise onPrepared sur OnCreateView, cela fonctionne bien et le volume de la vidéo a changé, mais à l'intérieur de mon bouton OnClickListener, aucun changement de volume ne s'est produit.


alors comment puis-je désactiver ma vidéo? (sans changer le volume de l'appareil)


Consultez mon premier commentaire pour cette réponse. Il a un lien vers une question connexe. Dans la méthode onPrepared, vous recevez un argument de méthode est l'instance du lecteur multimédia. Pour modifier le volume, vous avez besoin de cette instance. Vous pouvez l'enregistrer en tant que paramètre de classe (champ), puis l'utiliser dans votre écouteur de clic. Pour être honnête, ce n'est pas une bonne solution, mais pour vous comme pour les nouveaux développeurs, ça va, plus tard vous comprendrez pourquoi ce n'est pas bon.



0
votes

Le onPreparedListener.onPrepared () n'est appelé que si vous l'avez configuré avant onStart () .
Le diagramme d'état montre qu'un objet MediaPlayer doit d'abord entrer dans l'état Préparé avant que la lecture puisse être commencé.
Donc, commencez par définir onPreparedListener.onPrepared () puis appelez videoViewMain.start (); .


3 commentaires

Je change mon code et je définis onPrepared () avant videoViewMain.start (); Mais cela ne fonctionne toujours pas :(


Selon la documentation , après avoir défini la source de données et le surface d'affichage, vous devez appeler prepare () ou prepareAsync () . Vous jouez localement, alors appelez prepare () .


alors Ranjit qu'est-ce qui aurait causé cela? comme vous l'avez dit, j'ai défini mon auditeur avant start () et avant setVideoPath (videoPath) mais le problème est toujours sur.