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