2017-07-30 48 views
1

我有改變幾個片段狀態的外部事件,由於我使用的是Android架構的組件,我創建了幾個ModelViews每一個片段。如何獲得其他片段的視圖模型

什麼是ModelViews

之間發送消息
+0

我一直在玩這個了一會兒?任何更新? –

回答

0

正確的方式我假設你正在使用視圖模型在整個活動和片段娛樂活動保持狀態。你意識到viewModel本質上就是你的模型類,對嗎?那你爲什麼要在viewModels之間發送消息呢?

如果你有改變片段的狀態的外部事件,你應該把它傳播到你的活動,誰就會發送這些消息給你的片段,您可以更新您的視圖模型的狀態。

+0

好的,例如在onActivityResult中,我需要更新整個活動並設置其中一個片段上的文本。 所以我必須做好老findFragment在onActivityResult而不是模型到模型的溝通? –

-1

你應該在你的活動使用一個視圖模型爲您的活動。然後,您可以從您的活動和其他片段觀察這個視圖模型。

例如,下面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 DetailFragment extends LifecycleFragment { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class); 
     model.getSelected().observe(this, { item -> 
      // update UI 
     }); 
    } 
} 

訂閱後,您現在可以做改變你的事件數據,通知觀察片段或活動:

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); 
     }); 
    } 
} 

看看sharing data between fragments。有關android體系結構組件的Google文檔是有限但很好的。

+2

其實這是很糟糕的解決方案,儘可能SharedViewModel成爲存儲的一切,完全不可支持的一個神的對象。接下來的開發人員會因此而討厭你 –