【问题标题】:Share real time Data From Viewpager Fragment to Activity将 Viewpager Fragment 中的实时数据共享到 Activity
【发布时间】:2019-03-07 06:43:05
【问题描述】:

我的片段中有带有播放按钮的片段。每当用户从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);

注意我已经尝试找到预定义的解决方案,但没有找到任何东西。

【问题讨论】:

  • 我没有看到您创建ViewModel 并在您的活动中使用它的任何地方。你能更新你的代码吗?
  • 更新了@KingfisherPhuoc

标签: java android android-fragments viewmodel


【解决方案1】:

您实际上不必为此目的拥有ViewModel。您可能只考虑在托管FragmentsActivity 中拥有public 函数。例如,假设您的 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);
    }
});

希望对您有所帮助!

【讨论】:

  • 是的,这可能会有所帮助。是否有任何机会 ((MyActivity) getActivity()) 返回 null?工作室向我展示空指针异常警告。如果我使用我的活动实例(公共和静态)然后通过该实例访问我的活动功能,是否有任何缺点?
  • 在我看来,没有机会出现 NullPointerException。但是,如果有机会,您可以通过检查空值轻松避免崩溃。是的,您也可以拥有一个与您的应用程序设计相匹配的静态函数。
  • 好吧,我用这段代码找到了解决方案:D 我在 Fragment 中使用“this”关键字来初始化 MyViewModel 类,但它应该是 getActivity()。我的坏我太傻了。顺便说一句,谢谢你的帮助#Murshed
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多