setOnClickListener 在片段中不起作用

setOnClickListener not working in fragment

我正在尝试在我的片段中设置一个 onclicklistener,其中包含一个自定义工具栏,并且在工具栏中我有一个铃铛图标,我试图将其置于 onclicklistener 上但不是'没有工作

这是工具栏custom_toolbar.xml

<androidx.appcompat.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:title="@string/app_name">

    <RelativeLayout
            android:id="@+id/notification_bell"
            ..>
        <ImageView
               ..>
        <ImageView
                ..>
        <TextView
                ..>
    </RelativeLayout>
</androidx.appcompat.widget.Toolbar>

这是fragment.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".landing.ui.fragment.HomeFragment">

    <include android:id="@+id/custom_toolbar"
             layout="@layout/custom_toolbar"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

然后在Fragment.kt

class HomeFragment : Fragment() {

    private fun initbell(notificationCount:Int) {

        custom_toolbar.notification_bell.setOnClickListener {
            Log.e("Fragment","bell clicked")
        }

    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        init()
        .........
    }

    private fun init() {
        initComponent()
        ..........
    }

    private fun initComponent() {
        initbell(it)
        ..........
        }

    }

}

当铃响时,我想执行一些操作。目前,我应该能够显示日志。 而且我还能够访问它并更改它的可见性,因此它不是启动的问题

备选 :-

Take Relative layout as the header in fragment class like this

<androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".landing.ui.fragment.HomeFragment">

<RelativeLayout
    android:id="@+id/header_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
   >


    <ImageView
           ..>
    <ImageView
            ..>
    <TextView
            ..>


</RelativeLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

并在 fragment class 和 onCreate()

header_bar.setOnClickListener {
            Log.e("Fragment","bell clicked")
        }

试试这个, 向工具栏添加一个 id

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar 
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="?attr/actionBarSize"
android:id="@+id/tb_toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:title="@string/app_name">

<RelativeLayout
    android:id="@+id/notification_bell"
    android:layout_width="50dp"
    android:layout_height="match_parent"
    android:background="@color/colorAccent" />

然后里面片段

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    (context as AppCompatActivity).setSupportActionBar(tb_toolbar)

    notification_bell.setOnClickListener {
        Toast.makeText(context, "Yeaey", Toast.LENGTH_LONG).show()
    }
}

在 xml 中向工具栏标签添加一个 id,然后在 kotlin 文件中添加以下行 onViewCreated 方法

(上下文为 AppCompatActivity).setSupportActionBar(your_toolbar_id)

    your_toolbar_id.notification_bell.setOnClickListener {
        Log.d("TAG", "Your Log message here")
    }

如果你想让 RelativeLayout 处理点击,你应该给它添加 android:clickable 属性:

<RelativeLayout
   android:id="@+id/notification_bell"
   android:clickable="true"
..>

那是因为 RelativeLayout 会让触摸事件从它传递,以便子视图可以处理该事件。

所以我正在调查它,发现有一个小错误,我必须使用 AppBar 布局,这实际上解决了问题,因为 fragment.xml 无法获得 appbar 布局,所以它不是'识别点击。在此之后它就像一个魅力

在fragment.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            tools:context=".landing.ui.fragment.HomeFragment">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
             <include 
                android:id="@+id/custom_toolbar"
                layout="@layout/custom_toolbar"/>
    </com.google.android.material.appbar.AppBarLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>