我在Activity中有一个带有片段容器的工具栏
<androidx.appcompat.widget.Toolbar
android:id="@+id/tlUsersActivity"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/white"
/>
我运行这些行来控制按下的按钮
setSupportActionBar(binding?.tlUsersActivity)
if (supportActionBar != null) {
when (intent.getStringExtra(MainActivityAdmin.FRAGMENT_TYPE)) {
"View Users" -> {
supportActionBar?.title = viewUsersText
}
"Edit Users" -> {
supportActionBar?.title = editUsersText
}
}
supportActionBar?.setDisplayHomeAsUpEnabled(true)
binding?.tlUsersActivity?.setNavigationOnClickListener { onBackPressed() }
我想从片段内部改变这个动作,我想用一个替换片段的函数来替换它。我已经试过了,但是不起作用
val actionBar = view?.findViewById<Toolbar>(R.id.tlUsersActivity)
actionBar?.setNavigationOnClickListener {
replaceFragment(FragmentEditUsers())
}
1条答案
按热度按时间eyh26e7m1#
直接从片段中处理Activity不是一个好的做法,将来它会成为一个bug的巢穴))第一个选项是
SharedViewModel
,您可以在Activity和片段之间共享它。但是,如果您有简单的功能,并且不想在这里使用ViewModel
,那么您可能不需要它。第二个选项是,通常在Fragment Result API
和SharedViewModel
回调之前使用。我更喜欢的第三个回调是Fragment Result API
,它更简洁。您可以在这里找到更多信息-FragmentResultAPI & SharedViewModel。使用它,您可以在activity-to-fragment(活动到片段)和fragment-to-fragment(片段到片段)之间进行通信,反之亦然。您需要Gradle依赖项才能使用它:
在该活动中,您必须设置一个
FragmentResultListener
。它将请求密钥、生命周期和FragmentResultListener
接口作为参数,该接口是SAM接口(只有一个函数)。如果需要,您可以在此处进行深入研究。现在让我们看看片段方面。我有一个按钮,单击后,我会触发Activity中的result侦听器:
这里还有一张来自开发者页面的图片,它显示了使用
FragmentResultApi
进行片段到片段的通信。