ViewModel触发跳转页面
时间: 2024-05-12 11:13:43 浏览: 13
在ViewModel中触发页面跳转,一般需要使用到导航组件(Navigation Component)。下面是一个简单的示例:
1. 首先,在`build.gradle`文件中添加以下依赖:
```
dependencies {
def nav_version = "2.3.0"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}
```
2. 在`res`目录下创建一个名为`navigation`的文件夹,并在其中创建一个名为`nav_graph.xml`的文件。在该文件中添加所有需要跳转的页面及其之间的关系,例如:
```
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@id/homeFragment">
<fragment
android:id="@+id/homeFragment"
android:name="com.example.myapp.HomeFragment"
android:label="Home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/detailFragment"
android:name="com.example.myapp.DetailFragment"
android:label="Detail"
tools:layout="@layout/fragment_detail" />
<action
android:id="@+id/action_home_to_detail"
app:destination="@id/detailFragment" />
</navigation>
```
3. 在ViewModel中使用`Navigation`类的`navigate`方法触发页面跳转,例如:
```
class MyViewModel : ViewModel() {
private val _navigateToDetail = MutableLiveData<Boolean>()
val navigateToDetail: LiveData<Boolean>
get() = _navigateToDetail
fun onDetailButtonClicked() {
_navigateToDetail.value = true
}
fun onDetailNavigated() {
_navigateToDetail.value = false
}
}
```
在上面的代码中,`onDetailButtonClicked`方法会将`_navigateToDetail`的值设为`true`,从而触发页面跳转。在跳转完成后,需要调用`onDetailNavigated`方法,将`_navigateToDetail`的值设为`false`,以便下一次跳转。
4. 在需要触发页面跳转的界面中,使用`Navigation.findNavController(view)`方法获取到导航控制器,并在需要的时候调用`navigate`方法进行页面跳转,例如:
```
class HomeFragment : Fragment() {
private lateinit var viewModel: MyViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding: FragmentHomeBinding = DataBindingUtil.inflate(
inflater, R.layout.fragment_home, container, false
)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
binding.viewModel = viewModel
binding.lifecycleOwner = this
viewModel.navigateToDetail.observe(viewLifecycleOwner, Observer {
if (it == true) {
findNavController().navigate(R.id.action_home_to_detail)
viewModel.onDetailNavigated()
}
})
return binding.root
}
}
```
在上面的代码中,当`navigateToDetail`的值为`true`时,就会调用`findNavController().navigate(R.id.action_home_to_detail)`方法进行页面跳转。跳转完成后,再调用`viewModel.onDetailNavigated()`方法将`navigateToDetail`的值设为`false`。