我有一个带有片段容器的活动工具栏
<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())
}
直接从 Fragment 使用 Activity 不是一个好习惯,它会在未来成为一个错误的巢穴))第一个选项是SharedViewModel
您可以在您的 Activity 和 Fragment 之间共享。但是如果你有简单的功能并且你不想在ViewModel
这里参与,也许你不想要它。第二个选项,通常在之前使用Fragment Result API
并且SharedViewModel
是回调。我最喜欢的最后一个,它更干净的是Fragment Result API
。您可以在此处找到更多信息 - FragmentResultAPI。使用它,您可以在活动到片段、反之亦然和片段到片段之间进行通信。
您需要一个 Gradle 依赖项才能使用它:
implementation "androidx.fragment:fragment-ktx:1.4.1"
在活动中,您必须设置一个FragmentResultListener
. 它将请求密钥、生命周期和FragmentResultListener
接口作为参数,该接口是一个 SAM 接口(只有 1 个功能)。如果你愿意,你可以在这里深潜。
const val REQUEST_KEY = "101"
const val BUNDLE_KEY = "B101"
// Activity code
supportFragmentManager.setFragmentResultListener(REQUEST_KEY, this) { requestKey, bundle ->
if (requestKey == REQUEST_KEY) {
// Here you can call the functions you desire
Toast.makeText(this, bundle.getString(BUNDLE_KEY), Toast.LENGTH_SHORT).show()
}
}
现在让我们看看片段方面。我有一个按钮,点击后触发活动中的结果监听器:
// Fragment code
val btnTriggerActivity = view.findViewById<Button>(R.id.btn_trigger_activity)
btnTriggerActivity.setOnClickListener {
// This code will trigger the function in activity.
// The activity will show the toast
setFragmentResult(REQUEST_KEY, bundleOf(
BUNDLE_KEY to "Hello from the other side :)"
))
}
而已。这里还有一张来自开发者页面的图片,展示了使用FragmentResultApi
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句