将 Fragments/Bottomsheets 与 viewModel 重用为数据绑定变量
Reusing Fragments/Bottomsheets with viewModel as data binding variable
我举个例子,方便说明我的问题。
考虑在我的应用中使用 FragmentA
和 ViewModelA
以及 FragmentB
和 ViewModelB
。
我有一个 BottomSheetSample
用于 FragmentA
和 FragmentB
因为底部 sheet 做的很少,比如选择我想要的值共享显示底部 sheet 的片段的 ViewModel,而不是使用单独的 ViewModel 并将数据传输到 fragment
的 ViewModel
。我将这样的 ViewModel
绑定到导航图。
里面FragmentA
private val viewModel: ViewModelA by navGraphViewModels(R.id.nav_A_graph) { viewModelFactory }
里面BottomSheetSample
private val viewModel: ViewModelA by navGraphViewModels(R.id.nav_A_graph) { viewModelFactory }
我像这样将 ViewModel
传递给 XML 以便将其与数据绑定一起使用:
val binding: BottomSheetSampleBinding =
DataBindingUtil.inflate(inflater, R.layout.bottomSheet, container, false)
binding.viewModel = viewModel
样本底部 sheet XML:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="viewModel"
type="com.ui.fragmenta.ViewModelA" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.oneSelected()} />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.twoSelected()} />
</LinearLayout>
</layout>
现在的问题是我还必须在 FragmentB
中使用相同的底部 Sheet(BottomSheetSample
)。由于我将 ViewModel
传递给 XML 以进行数据绑定,因此我无法使用与当前 BottomSheetSampleBinding
期望对象 [=] 相同的底部 sheet 17=]。
所以我最终做的是创建一个新的 BottomSheetSampleB
,它做的事情与 BottomSheetSample
完全相同,只需将新的 XML 中的 ViewModel 更改为 ViewModelB
:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="viewModel"
type="com.ui.fragmentb.ViewModelB" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.oneSelected()} />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.twoSelected()} />
</LinearLayout>
</layout>
现在,如果我必须在第三个片段中使用相同的 BottomSheet,我必须复制 BottomSheetSample 并再次执行整个操作。这看起来是多余的,因为同一个底部 sheet 被一次又一次地复制。但我不知道如何避免这样做。谁能告诉我正确的方法吗?
希望我清楚我的问题。
创建一个 BaseViewModel
(任何名称)并将底部 sheet 所需的所有内容保留在 BaseViewModel
中。在底部使用这个 BaseViewModel Sheet
<layout>
<data>
<variable
name="viewModel"
type="com.ui.fragmentb.BaseViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.oneSelected()}" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.twoSelected()}" />
</LinearLayout>
</layout>
用 BaseViewModel
扩展您的 ViewModelA
,ViewModelB
我举个例子,方便说明我的问题。
考虑在我的应用中使用 FragmentA
和 ViewModelA
以及 FragmentB
和 ViewModelB
。
我有一个 BottomSheetSample
用于 FragmentA
和 FragmentB
因为底部 sheet 做的很少,比如选择我想要的值共享显示底部 sheet 的片段的 ViewModel,而不是使用单独的 ViewModel 并将数据传输到 fragment
的 ViewModel
。我将这样的 ViewModel
绑定到导航图。
里面FragmentA
private val viewModel: ViewModelA by navGraphViewModels(R.id.nav_A_graph) { viewModelFactory }
里面BottomSheetSample
private val viewModel: ViewModelA by navGraphViewModels(R.id.nav_A_graph) { viewModelFactory }
我像这样将 ViewModel
传递给 XML 以便将其与数据绑定一起使用:
val binding: BottomSheetSampleBinding =
DataBindingUtil.inflate(inflater, R.layout.bottomSheet, container, false)
binding.viewModel = viewModel
样本底部 sheet XML:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="viewModel"
type="com.ui.fragmenta.ViewModelA" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.oneSelected()} />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.twoSelected()} />
</LinearLayout>
</layout>
现在的问题是我还必须在 FragmentB
中使用相同的底部 Sheet(BottomSheetSample
)。由于我将 ViewModel
传递给 XML 以进行数据绑定,因此我无法使用与当前 BottomSheetSampleBinding
期望对象 [=] 相同的底部 sheet 17=]。
所以我最终做的是创建一个新的 BottomSheetSampleB
,它做的事情与 BottomSheetSample
完全相同,只需将新的 XML 中的 ViewModel 更改为 ViewModelB
:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="viewModel"
type="com.ui.fragmentb.ViewModelB" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.oneSelected()} />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.twoSelected()} />
</LinearLayout>
</layout>
现在,如果我必须在第三个片段中使用相同的 BottomSheet,我必须复制 BottomSheetSample 并再次执行整个操作。这看起来是多余的,因为同一个底部 sheet 被一次又一次地复制。但我不知道如何避免这样做。谁能告诉我正确的方法吗?
希望我清楚我的问题。
创建一个 BaseViewModel
(任何名称)并将底部 sheet 所需的所有内容保留在 BaseViewModel
中。在底部使用这个 BaseViewModel Sheet
<layout>
<data>
<variable
name="viewModel"
type="com.ui.fragmentb.BaseViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.oneSelected()}" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.twoSelected()}" />
</LinearLayout>
</layout>
用 BaseViewModel
ViewModelA
,ViewModelB