【问题标题】:Recommended way to pass data from activity to viewPager fragment将数据从活动传递到 viewPager 片段的推荐方法
【发布时间】:2018-08-06 14:02:52
【问题描述】:

我有一个执行网络操作的活动,如果成功,它需要向view pager fragment 发送数据。

这就是我的结构。

Activity -> Home Fragment -> ViewPager [Fragment#1, Fragment#2]

现在的问题是我可以将数据从Activity 发送到Home Fragment,但我无法将数据发送到View Pager Fragment,因为活动与它没有任何直接联系。

为了解决这个问题,我已经从活动到片段进行网络调用,一旦我得到来自service call 的响应,我将数据从Home Fragment 传递给viewPager 片段。

这工作正常,给了我想要的结果,但如果这是正确的方法,我有点困惑。

或者我可以使用其他一些推荐的方法,并将数据从活动传递到子片段,或查看 Pager 片段,其引用不能直接用于活动。

【问题讨论】:

    标签: android performance android-layout android-fragments android-viewpager


    【解决方案1】:

    我会看看新的 Android 架构组件,特别是 ViewModelLiveDatahttps://developer.android.com/topic/libraries/architecture/viewmodel

    ViewModel 类旨在存储和管理与 UI 相关的数据 一种生命周期意识的方式。

    您可以创建一个共享视图模型,该模型可以被 Activity 和该 Activity 中的任何 Fragment 访问。

    链接示例:

    public class SharedViewModel extends ViewModel {
        private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
    
        public void select(Item item) {
            selected.setValue(item);
        }
    
        public LiveData<Item> getSelected() {
            return selected;
        }
    }
    
    
    public class MasterFragment extends Fragment {
        private SharedViewModel model;
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
            itemSelector.setOnClickListener(item -> {
                model.select(item);
            });
        }
    }
    
    public class DetailFragment extends Fragment {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
            model.getSelected().observe(this, item -> {
               // Update the UI.
            });
        }
    }
    

    请注意,两个片段在获取 视图模型提供者。结果,两个片段都收到相同的 SharedViewModel 实例,作用域为 Activity。

    对于您的示例,这避免了将数据从活动传递到片段然后子片段的层次结构,它们都可以引用SharedViewModel

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多