關於MVVM新的架構組件,我有一個問題,我應該如何實施,如果我的應用程序需要與一些行動,在我的VM發生3個選項,以顯示例如一個對話框?誰負責發送Activity/Fragment命令來顯示對話框?顯示對話框從視圖模型中的Android MVVM架構
回答
像打開新的活動或示出的對話框UI相關的動作從,而不是從一個ViewModel視圖(活動或片段)觸發。 ViewModel沒有引用視圖來防止泄漏並保持表示層「被動」。
您可以訂閱您的視圖模型視圖(活動或片段),以可觀察到的,這樣,當它改變,就可以從查看啓動對話或新的活動。
如果對話由用戶直接輸入觸發,說點擊一個按鈕,你可以使用事件參數來獲取一個臨時參考含活性。因此,在你的XML,如果你點擊事件綁定到一個方法:
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:onClick="@{model.onClicked}" />
您的視圖模型將有可能在它是這樣的:
public void onClicked(View view)
{
MyDialogFragment.newInstance(
(di, whichButton) -> doOkClicked(di, whichButton),
(di, whichButton) -> doCancelClicked(di, whichButton)
).show(((Activity)view.getContext()).getFragmentManager(), "MyTag");
}
public void doOkClicked(DialogInterface dialog, int whichButton)
{
...
}
public void doCancelClicked(DialogInterface dialog, int whichButton)
{
...
}
有些人可能會認爲這違反了MVVM原則。我不認爲這是一個主要問題,只要您不保留對視圖參數或與其關聯的上下文的引用即可。在可測試性方面,它不會比在視圖(活動/片段)中具有可測性。就個人而言,我喜歡儘可能少地保留視圖中的代碼。
更純粹的方法可能是創建一個管理所有導航事件的導航服務。我在WPF中用MVVM Light做了類似的事情,但是Android有很大的不同,我還沒有完全探索所有我認爲有很多的陷阱。
在這種情況下,VM知道UI。如果我們將改變UI邏輯(例如,將Ok和Cancel按鈕從對話框移動到邊上的Fragment),我們需要更改VM。 –
@ Danylo.Vus VM知道一個視圖,不一定是任何特定的視圖。這只是一個簡短的參考。不幸的是,我很清楚沒有這樣做的好方法。 – Glaucus
- 1. 從視圖模型在MVVM架構
- 2. 顯示對話框MVVM模式
- 3. WinRT中的對話服務/ MVVM架構中的自定義模式對話框
- 4. 模型類不會顯示在添加視圖對話框中
- 5. 顯示來自視圖模型的MahApps.Metro對話框
- 6. 視圖模型注入(內視圖)與MVVM架構
- 7. WPF MVVM:從視圖模型
- 8. 如何結合使用MVVM架構的數據視圖模型中的Android
- 9. android從對話框中刪除視圖?
- 10. MVVM:設計視圖模型架構,聚合/依賴的ViewModels
- 11. Android從對話框中顯示另一個對話框
- 12. 使用MVVM Foundation Messenger顯示對話框
- 13. 使用MVVM Foundation Messenger顯示對話框
- 14. 印在WPF與MVVM - 從視圖中顯示PrintDialog類,但與視圖模型
- 15. MVVM Light - 子視圖和對話框
- 16. 顯示對話框在視圖中充氣由windowmanager在android中
- 17. 在Android中的對話框中顯示警報對話框?
- 18. WPF MVVM:從視圖模型訪問列表視圖對象
- 19. Qt模型/視圖框架,樹視圖
- 20. 如何在Android中顯示對話框中的對話框?
- 21. 顯示模式對話框
- 22. 對話框不顯示android
- 23. Android:顯示對話框類
- 24. 未顯示Android對話框
- 25. 從視圖啓動Android對話框
- 26. 有沒有辦法從BEHIND視圖中顯示對話框?
- 27. Android中的對話框顯示
- 28. 顯示模態登錄對話框
- 29. 在Android中顯示消息對話框
- 30. 對話框中的Web視圖有時不顯示圖像
感謝您的回答,這個解決方案是我想象的,但我不確定這是否是最好的方法。再次感謝。 –
我正在做的是創建一個LiveData我需要在我的視圖中觸發以調用一個新的屏幕或顯示對話框的每一個動作,但我不滿意這個解決方案,這在我看來並不正確。 –
我們正在爲此準備一個樣本。我將其稱爲'LiveEvent',它使用'LiveData'來檢查它是否已被調用。敬請關注。 –