如何从片段更改操作栏导航 onClick 侦听器
How to change action bar navigation onClick listener from fragment
我在 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())
}
直接使用片段中的 Activity 不是一个好习惯,以后会变成一堆 bug))
第一个选项是 SharedViewModel
,您可以在 activity 和片段之间共享它。但是,如果您的功能简单并且不想在此处涉及 ViewModel
,那么您可能不想要它。
通常在 Fragment Result API
和 SharedViewModel
之前使用的第二个选项是回调。
第三个我更喜欢并且更干净的是 Fragment Result API
。
您可以在此处找到更多信息 - FragmentResultAPI & SharedViewModel。
使用它,您可以在 activity-to-fragment、vice-versa 和 fragment-to-fragment.
之间进行通信
您需要 Gradle 依赖才能使用它:
implementation "androidx.fragment:fragment-ktx:1.4.1"
在activity中,你要设置一个FragmentResultListener
。它以请求密钥、生命周期和作为 SAM 接口的 FragmentResultListener
接口(只有 1 个功能)作为参数。如果你愿意,你可以在这里deep-dive。
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()
}
}
现在让我们看看片段方面。我有一个按钮,单击后我在 activity:
中触发结果侦听器
// 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 :)"
))
}
就是这样。这里还有一张来自开发者页面的图片,显示了 fragment-to-fragment 使用 FragmentResultApi
.
的通信
我在 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())
}
直接使用片段中的 Activity 不是一个好习惯,以后会变成一堆 bug))
第一个选项是 SharedViewModel
,您可以在 activity 和片段之间共享它。但是,如果您的功能简单并且不想在此处涉及 ViewModel
,那么您可能不想要它。
通常在 Fragment Result API
和 SharedViewModel
之前使用的第二个选项是回调。
第三个我更喜欢并且更干净的是 Fragment Result API
。
您可以在此处找到更多信息 - FragmentResultAPI & SharedViewModel。
使用它,您可以在 activity-to-fragment、vice-versa 和 fragment-to-fragment.
您需要 Gradle 依赖才能使用它:
implementation "androidx.fragment:fragment-ktx:1.4.1"
在activity中,你要设置一个FragmentResultListener
。它以请求密钥、生命周期和作为 SAM 接口的 FragmentResultListener
接口(只有 1 个功能)作为参数。如果你愿意,你可以在这里deep-dive。
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()
}
}
现在让我们看看片段方面。我有一个按钮,单击后我在 activity:
中触发结果侦听器// 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 :)"
))
}
就是这样。这里还有一张来自开发者页面的图片,显示了 fragment-to-fragment 使用 FragmentResultApi
.