我正在使用MVVM模式创建一个应用程序。我正在使用导航图来管理我的应用程序中的片段,并根据建议的方法,我们不必将UI逻辑放在Activity / Fragments中,而是放在Viewmodel中。
所以我的问题是如何从一个片段导航到另一个片段。我知道可以在片段内直接使用
我的代码:
所以我的问题是如何从一个片段导航到另一个片段。我知道可以在片段内直接使用
navController.navigate(R.id.action_here)
来完成此操作,但是如果要在按下按钮时从ViewModel处理导航该怎么办?我的代码:
IntroViewModel.kt
class IntroViewModel : ViewModel() {
fun onBtn1Pressed(view: View) {
Log.d(IntroViewModel::class.java.simpleName, ": onBtn1Pressed")
}
fun onBtn2Pressed(view: View) {
Log.d(IntroViewModel::class.java.simpleName, ": onBtn2Pressed ")
}
}
IntroFragment.kt:
class IntroFragment : Fragment() {
private lateinit var viewModel: IntroViewModel
private lateinit var navController: NavController
lateinit var introBinding: IntroFragmentBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
introBinding = DataBindingUtil.inflate(inflater, R.layout.intro_fragment, container, false)
viewModel = ViewModelProviders.of(this).get(IntroViewModel::class.java)
introBinding.introModel = viewModel
return introBinding.root;
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
navController = Navigation.findNavController(view)
}
}
intro_fragment.xml:
<data>
<variable
name="introModel"
type="example.com.viewmodel.IntroViewModel" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="@dimen/padding_16dp"
tools:context=".fragments.IntroFragment">
<TextView
android:id="@+id/txt_"
style="@style/TextAppearance.MaterialComponents.Headline5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="Choose one " />
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/txt_"
android:onClick="@{introModel::onBtn1Pressed}"
android:layout_marginTop="@dimen/margin_8dp"
android:text="Btn1" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_2"
style="@style/Widget.MaterialComponents.Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{introModel::onBtn2Pressed}"
android:layout_below="@id/btn_1"
android:layout_alignStart="@id/btn_1"
android:layout_alignEnd="@id/btn_1"
android:layout_marginTop="@dimen/margin_8dp"
android:text="Btn2" />
</RelativeLayout>
onViewCreated()
中初始化它,以便ViewModel可以处理导航,这是否违反了您的设计选择规则? - Jacob Collins