要实现Android中的嵌套ViewModel与导航控制器,可以按照以下步骤进行操作:
build.gradle
文件中添加以下依赖项:implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
implementation "androidx.navigation:navigation-fragment-ktx:2.3.5"
implementation "androidx.navigation:navigation-ui-ktx:2.3.5"
NavHostFragment
来承载导航控制器的主要视图。例如,创建一个名为nav_host_fragment
的FrameLayout
:
MainActivity
中初始化导航控制器和ViewModel。在onCreate
方法中添加以下代码:class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
navController = navHostFragment.navController
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
}
}
ViewModel
类,用于保存嵌套导航的相关数据。例如,创建一个名为MainViewModel
的类:class MainViewModel : ViewModel() {
private val _selectedItemId = MutableLiveData()
val selectedItemId: LiveData get() = _selectedItemId
fun setSelectedItemId(itemId: Int) {
_selectedItemId.value = itemId
}
}
NavGraph
中定义嵌套导航。在res/navigation
目录中创建一个名为nav_graph.xml
的文件,并添加以下内容:
HomeFragment
中使用ViewModel
来处理导航操作。例如,在HomeFragment
的点击事件中添加以下代码:class HomeFragment : Fragment() {
private val viewModel: MainViewModel by activityViewModels()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_home, container, false)
view.button.setOnClickListener {
viewModel.setSelectedItemId(R.id.action_homeFragment_to_detailFragment)
}
return view
}
}
MainActivity
中设置导航控制器的监听器,以便在ViewModel中的数据更改时执行相应的导航操作。例如,在onCreate
方法中添加以下代码:class MainActivity : AppCompatActivity() {
// ...
override fun onCreate(savedInstanceState: Bundle?) {
// ...
viewModel.selectedItemId.observe(this, { itemId ->
itemId?.let {
navController.navigate(it)
}
})
}
}
通过以上步骤,你就可以在Android中实现嵌套ViewModel与导航控制器了。点击HomeFragment
中的按钮时,会将选定的导航目标ID设置到ViewModel中,然后通过MainActivity
中的导航控制器进行相应的导航操作。