android-fragments 如何从片段更改操作栏导航onClick侦听器

57hvy0tb  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(149)

我在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())
    }
eyh26e7m

eyh26e7m1#

直接从片段中处理Activity不是一个好的做法,将来它会成为一个bug的巢穴))第一个选项是SharedViewModel,您可以在Activity和片段之间共享它。但是,如果您有简单的功能,并且不想在这里使用ViewModel,那么您可能不需要它。第二个选项是,通常在Fragment Result APISharedViewModel回调之前使用。我更喜欢的第三个回调是Fragment Result API,它更简洁。您可以在这里找到更多信息-FragmentResultAPI & SharedViewModel。使用它,您可以在activity-to-fragment(活动到片段)和fragment-to-fragment(片段到片段)之间进行通信,反之亦然。
您需要Gradle依赖项才能使用它:

implementation "androidx.fragment:fragment-ktx:1.4.1"

在该活动中,您必须设置一个FragmentResultListener。它将请求密钥、生命周期和FragmentResultListener接口作为参数,该接口是SAM接口(只有一个函数)。如果需要,您可以在此处进行深入研究。

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中的result侦听器:

// 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进行片段到片段的通信。

相关问题