如何处理首选项(PreferenceFragment)中自定义项的点击事件?

How to handle click events on custom items in the preference(PreferenceFragment)?

我为首选项创建了自定义布局,以便向其中添加新的自定义项目。 我使用 android:layout 属性 添加该布局。我的自定义布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:gravity="center_vertical"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:background="?android:attr/selectableItemBackground"
    android:clipToPadding="false"
    android:baselineAligned="false">

    <include layout="@layout/image_frame"/>

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingTop="16dp"
        android:paddingBottom="16dp">

        <TextView
            android:id="@android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceListItem"
            android:ellipsize="marquee"/>

        <TextView
            android:id="@android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@android:id/title"
            android:layout_alignStart="@android:id/title"
            android:layout_gravity="start"
            android:textAlignment="viewStart"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="10"
            style="@style/PreferenceSummaryTextStyle"/>

    </RelativeLayout>

    <ImageView
        android:id="@+id/`preference_info`"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_info"
        android:layout_marginStart="16dp"
        tools:ignore="ContentDescription" />

    <LinearLayout
        android:id="@android:id/widget_frame"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="end|center_vertical"
        android:paddingStart="16dp"
        android:paddingEnd="0dp"
        android:orientation="vertical"/>

</LinearLayout>

我的新商品有 preference_info 个 ID。如何处理 onPreferenceTreeClick 上的点击事件以处理整个偏好行上的简单点击事件?

这不是从首选项中获取自定义布局视图的直接方法,您必须创建一个从 androidx.preference 扩展 Preference 的自定义首选项,并且重写任一 onBindView(view:View) 方法,只有在那里你才能获得首选项布局中的视图。

 class CustomInfoPreference(context:Context) : Preference(context){
      constructor(context: Context, attrs: AttributeSet): super(context,attrs)

      override protected fun onBindView(view:View){ 
        super(view)
      val preferenceInfo = view.findViewById<ImageView>(R.id.preference_info) 
       
       preferenceInfo.setOnClickListener{
           // Perform action!
          }
        }

     }

然后在您的 preference.xml 中,您可以像这样使用自定义首选项:

<PreferenceCategory
android:title="...." >

<com.example.appname.CustomInfoPreference
        android:key="pref key"
        android:title="your pref title"
        android:summary="your pref summary"
        android:defaultValue=""
        android:layout="@layout/custom_preference_layout" />

 </PreferenceCategory>

同时检查这个 SO 线程: