从Viewpager片段到活动共享实时数据

时间:2019-03-07 06:43:06

标签: java android android-fragments viewmodel

我的片段中有带有播放按钮的片段。每当用户按下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 :(得分:0)

为此,您实际上不必具有ViewModel。您可能只考虑在托管public的{​​{1}}中拥有Activity函数。例如,让我们考虑一下您的Fragments中具有以下public函数,它将启动所有其他片段。

PlayerActivity

现在,您可能只考虑使用以下public void play(String songName) { viewModel.getIsPlaying().setValue(true); viewModel.getCheck().setValue("Checking"); // Other actions for playing } 函数,而不是现在使用的函数。

onClick

希望有帮助!

答案 1 :(得分:0)

您还可以设置播放功能公共静态

您的代码显示如下

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

并调用此函数,如

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

希望对您有帮助!

谢谢。