如何从片段更改操作栏导航 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 APISharedViewModel 之前使用的第二个选项是回调。 第三个我更喜欢并且更干净的是 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.

的通信