Обмен данными в реальном времени от фрагмента ViewPager к деятельности - PullRequest
1 голос
/ 07 марта 2019

У меня есть фрагменты с кнопкой воспроизведения в моем фрагменте. Всякий раз, когда пользователь нажимает кнопку воспроизведения из фрагмента ViewPager, он вызывает функцию в активности хоста, которая воспроизводит проигрыватель.

Я пытаюсь реализовать данные в реальном времени, используя ViewModel, но безуспешно.

public class SlidePlayerFragment extends Fragment {

    private MyViewModel viewModel;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View view = inflater.inflate(R.layout.fragment_slide_player, container, false);

        ImageView playBtn = view.findViewById(R.id.playBtn);
        playBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModel.getIsPlaying().setValue(true);
                viewModel.getCheck().setValue("Checking");
            }
        });
        return view;
       }
    }
}

Вот мой PagerAdapter

public class MyViewPagerAdapter extends FragmentStatePagerAdapter {
    private int pages;
    public MyViewPagerAdapter(FragmentManager fm,int count) {
        super(fm);
        pages = count;
    }

    @Override
    public Fragment getItem(int i) {
        return new SlidePlayerFragment();
    }

    @Override
    public int getCount() {
        return pages;
    }
}

Вот функция просмотра модели

private MutableLiveData<Boolean> isPlaying;

public MutableLiveData<Boolean> getIsPlaying() {
    if (isPlaying == null)
        isPlaying = new MutableLiveData<>();
    Log.d("TAG","Checking "+isPlaying.getValue());
    return isPlaying;
}

А вот и сегмент наблюдателя

final Observer<Boolean> isPlaying= isPlaying -> {
    //code here if playing then do some task here
};

viewModel.getIsPlaying().observe(this,isPlaying);

Примечание Я уже пытался найти предопределенное решение, но ничего не нашел.

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Вы также можете сделать свою функцию воспроизведения Общедоступной статической

Ваш код будет отображаться так

public static void play() {
    // actions for playing
}

И вызывать эту функцию как

playBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        YourActivityName.play();
    }
});

Надеюсь, что поможет вам!

Спасибо.

0 голосов
/ 07 марта 2019

Вам не обязательно иметь ViewModel для этой цели.Вы можете просто рассмотреть возможность использования public функций в Activity, в котором находится Fragments.Например, давайте предположим, что в вашем PlayerActivity есть следующие public функции, которые запускают все остальные фрагменты.

public void play(String songName) {
    viewModel.getIsPlaying().setValue(true);
    viewModel.getCheck().setValue("Checking");
    // Other actions for playing
}

Теперь вы можете просто рассмотреть следующую функцию onClick вместоодин у вас сейчас.

playBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ((PlayerActivity) getActivity()).play(songName);
    }
});

Надеюсь, это поможет!

...