如何从首选项布局中删除默认标题和摘要

How to remove default title and summery from preference layout

我正在尝试创建自定义首选项设置(其中将包含标题、摘要和向用户指示同步过程的进度条)。 我在完全删除原始标题和摘要时遇到问题,因为它看起来在布局中有缩进(有关更多详细信息,请参见附图)

我创建了自定义布局:

R.layout.manual_sync_layout

<?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="wrap_content"
        android:clickable="true"
        android:focusable="true"
        android:id="@+id/manual_sync_layout"
        android:background="?attr/selectableItemBackground">


    <ImageView
            android:id="@android:id/icon"
            app:layout_constraintTop_toTopOf="parent"
            android:visibility="gone"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@null"
            android:layout_gravity="center"/>

    <TextView android:id="@android:id/title"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              app:layout_constraintStart_toStartOf="parent"
              app:layout_constraintTop_toTopOf="parent"
              android:textSize="16sp"
              android:padding="10dp"
              android:text="@string/manual_sync"
              android:textColor="@android:color/black"/>
    <TextView
            app:layout_constraintTop_toBottomOf="@android:id/title"
            app:layout_constraintStart_toStartOf="parent"
            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:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="4"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:text="@string/sync_manually_desc"
    />

    <ProgressBar
            android:id="@+id/manual_sync_progress"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            android:indeterminate="false"
            app:layout_constraintEnd_toEndOf="parent"
            style="?android:attr/progressBarStyleSmall"
            android:padding="10dp"
            android:visibility="gone"/>

</androidx.constraintlayout.widget.ConstraintLayout>

手动同步首选项

class ManualSyncPreference @JvmOverloads 构造函数(上下文:上下文,属性:AttributeSet,defStyleAttr:Int = 0): 首选项(上下文,属性,defStyleAttr){

init {
    widgetLayoutResource = R.layout.manual_sync_layout
}

override fun onBindViewHolder(holder: PreferenceViewHolder) {
    super.onBindViewHolder(holder)
    val manualSyncLayout = holder.findViewById(R.id.manual_sync_layout)
    val syncProgress = holder.findViewById(R.id.manual_sync_progress)
    manualSyncLayout.setOnClickListener {
        syncProgress.visibility = if(syncProgress.visibility== View.VISIBLE) View.GONE else View.VISIBLE
    }

}

}

preferences.xml

<PreferenceCategory
        app:title="@string/sync_header">

    <SwitchPreferenceCompat
            app:key="sync"
            app:title="@string/sync_title"/>

    <SwitchPreferenceCompat
            app:key="attachment"
            app:title="@string/attachment_title"
            app:summaryOn="@string/attachment_summary_on"
            app:summaryOff="@string/attachment_summary_off"
            app:dependency="sync"/>

    <com.example.myapplication.ManualSyncPreference
            app:key="manual_key"
            app:title=""
            app:summary=""/>

</PreferenceCategory>

there is a big margin in the last row

您需要设置 layoutResource 而不是 widgetLayoutResource - 小部件布局资源是首选项布局的一部分,它在末尾包含一个小部件,例如开关或复选框。在您的情况下,您想要替换 entire 布局,因此您需要更改 layoutResource。我认为只需将 widgetLayoutResource 重命名为 layoutResource 就可以了。