工具栏 setNavigationOnClickListener 不起作用/被忽略

Toolbar setNavigationOnClickListener doesnt work / gets ignored

在我的应用程序中,有一个 activity 需要在点击导航时关闭。过去,下面的代码可以正常工作,但是,由于新的 Android 更改,它不再工作了。

是否有调用导航图标点击的新方法?我有什么遗漏吗?

ActivitySettings.kt

class ActivitySettings : AppCompatActivity() {

    private lateinit var binder: ActivitySettingsBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binder = ActivitySettingsBinding.inflate(layoutInflater)
        setContentView(R.layout.activity_settings)

        binder.topToolbarBack.setNavigationOnClickListener {
            finish()
        }
    }
}

activity_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/topToolbarBack"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:navigationIconTint="@color/white_material"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navigationIcon="@drawable/ic_outline_arrow_back_24"
        app:popupTheme="@style/popupMenuThemeDark"
        app:title="@string/currentScreenSettings"
        app:titleTextColor="@color/white_material" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rvSettings"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/topToolbarBack" />

</androidx.constraintlayout.widget.ConstraintLayout>

请确保在为工具栏设置点击侦听器之前调用 setSupportActionBar(binder.topToolbarBack)

此问题是由调用布局的方式引起的。

binder可以认为是“二次布局”。由于在那activity,我设置为ContenteView R.layout.activity_settings,仍然可以从布局中获取元素的活页夹基本上被当前设置的布局覆盖。

如果您想使用 binder,您必须在 setContentView() binder.root 中进行设置,这会加载您需要的正确布局。

所以,固定的代码是:

class ActivitySettings : AppCompatActivity() {

    private lateinit var binder: ActivitySettingsBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binder = ActivitySettingsBinding.inflate(layoutInflater)
        setContentView(binder.root)

        binder.topToolbarBack.setNavigationOnClickListener {
            finish()
        }
    }
}