0
  • Activity 中的两个或更多 Fragment 需要相互通信是一种很常见的现象.

    可以使用 ViewModel 对象解决这一常见的难点。这两个 fragment 可以使用其 activity 范围共享 ViewModel 来处理此类通信,如以下示例代码所示:

    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 ListFragment extends Fragment {
        private SharedViewModel model;
    
        public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
            itemSelector.setOnClickListener(item -> {
                model.select(item);
            });
        }
    }
    
    public class DetailFragment extends Fragment {
    
        public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
            model.getSelected().observe(getViewLifecycleOwner(), item -> {
               // Update the UI.
            });
        }
    }
    
    

    请注意,这两个 Fragment 都会检索包含它们的 Activity。这样,当这两个 Fragment 各自获取 ViewModelProvider 时,它们会收到相同的 SharedViewModel 实例(其范围限定为该 Activity)。

    此方法具有以下优势:

    • Activity 不需要执行任何操作,也不需要对此通信有任何了解。
    • 除了 SharedViewModel 约定之外,Fragment 不需要相互了解。如果其中一个 Fragment 消失,另一个 Fragment 将继续照常工作。
    • 每个 Fragment 都有自己的生命周期,而不受另一个 Fragment 的生命周期的影响。如果一个 Fragment 替换另一个 Fragment,界面将继续工作而没有任何问题。



    ViewModel 概览 | Android 开发者 | Android Developers (google.cn)

    1438150393807872001  评论     打赏       lifeee
    •  https://developer.android.google.cn/topic/libraries/architecture/lifecycle#lco
      这是最新文档
      
      1139423796017500160  评论     打赏       断点-含光君
      • ViewModel数据共享是因为它的owner一样呀。


        因为owner所以拿到的是同一个ViewModel


        你说这个过时了,点进去看看呀,文档会有说明的,用什么替代。

        1153952789488054272  评论     打赏       拉大锯
        相关问题
        _empty · Android
        2019-10-20 23:51 628 2
        application · Android
        2019-11-05 00:26 779 2
        三流废物 · android / 小白
        2019-11-22 00:35 1067 5
        豪豪好嘛 · Android / GPS
        2019-11-26 20:15 884 5
        Jian · android
        2019-11-28 01:51 615 2
        2019-12-01 01:01 705 2
        小陈学编程 · Android
        2019-12-01 19:08 633 2
        fkinggod · Android
        2019-12-08 09:19 661 5
        fkinggod · Android
        2019-12-08 20:47 610 2
        kissmyass · Android
        2019-12-09 07:08 537 2
        独一无二的名zi · Android
        2019-12-30 06:48 415 2