почему я не могу получить доступ к своим кодам внутри "на подготовленном слушателе" внутри "на слушателе щелчка" во фрагменте, чтобы отключить мое видео? - PullRequest
0 голосов
/ 06 февраля 2019

Я новичок в Android, и у меня возникла проблема с отключением видео в OnClickListener внутри фрагмента.Я использую 3 разных динамических фрагмента.мой второй фрагмент должен воспроизвести видео.У меня есть кнопка отключения звука в этом фрагменте, чтобы сделать мое видео выключенным и включенным после повторного нажатия.Я использую OnPreparedListener в моем Button OnClickListener, но он абсолютно ничего не делает без ошибок !!удивительно, это работает хорошо, когда я использую это вне моего Button OnClickListener.так почему это произошло и как я могу использовать его внутри OnClickListener?

вот мой код MainActivity

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

и вот мой фрагмент видео

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

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Вы установили MediaPlayer.OnPreparedListener () слишком поздно.Как я понимаю, вы начинаете воспроизводить видео, прежде чем установить слушателя.Поэтому, когда слушатель был настроен, проигрыватель «Подготовить событие» уже прошел.

Сначала нужно настроить слушателя и только потом начинать воспроизведение видео.В этом случае слушатель будет запущен.

0 голосов
/ 06 февраля 2019

onPreparedListener.onPrepared() вызывается только в том случае, если вы настроили его до onStart().
Диаграмма состояний показывает, что объект MediaPlayer должен сначала войти в состояние «Подготовлено», прежде чем можно будет начать воспроизведение.
Итак, сначала установите onPreparedListener.onPrepared(), а затем позвоните videoViewMain.start();.

0 голосов
/ 06 февраля 2019

try

SecondFragment.this.onIbntMuteSecFragListener();

, потому что вы на самом деле в анонимном классе View.OnclickListener (), и этот экземпляр не реализует метод, который вы пытаетесь получить из этой внешней области видимости Fragment ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...