默认情况下,PreferenceFragmentCompat 的 iconSpaceReserved 为 true

PreferenceFragmentCompat has iconSpaceReserved true by default

我已经迁移到 androidx.* 库,其中之一是新的首选项库: androidx.preference:preference:1.1.0-alpha01 - 最新版本。

release notes 中所述,iconSpaceReserved 属性无法与 PreferenceCategories 一起正常工作已修复。

但看起来它默认设置为 true

我已经构建了演示项目来测试它。

PreferencesFragment

import androidx.preference.PreferenceFragmentCompat;

public class SetttingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.preferences);
    }
}

preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <PreferenceCategory android:title="Category 1">
        <Preference
            android:key="pref1"
            android:title="Preference 1" />
        <Preference
            android:key="pref2"
            android:title="Preference 2" />
    </PreferenceCategory>
    <PreferenceCategory
        android:title="Category 2"
        app:iconSpaceReserved="false">
        <Preference
            android:key="pref3"
            android:title="Preference 3" />
        <Preference
            android:key="pref4"
            android:title="Preference 4"
            app:iconSpaceReserved="false" />
    </PreferenceCategory>
    ...
</PreferenceScreen>

偏好主题根据需要设置。

styles.xml

<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>

截图

当手动设置 app:iconSpaceReserved=false 时(如您在 PreferenceCategory 2 和 Preference 4 中所见),它工作正常,但除此之外,图标的 space 被保留。 另外 docs 表示它默认为 false

By default, preference icon view visibility will be set to GONE when there is no icon provided, so the default value of this attribute is false.

如果没有设置图标就留下space是这个库的新bug还是新特性?还是我做错了什么?

我知道解决方法:


编辑:

在浏览完资源后,我发现了下一个东西。

PreferenceThemeOverlay -> anyPreferenceStyle 已设置属性

<item name="iconSpaceReserved">@bool/config_materialPreferenceIconSpaceReserved</item>

指的是

values/values.xml
    <bool name="config_materialPreferenceIconSpaceReserved">false</bool>

values-sw360dp-v13/values-sw360dp-v13.xml
    <bool name="config_materialPreferenceIconSpaceReserved">true</bool>

出于某种原因,这里设置为 true

posted this on the Issue Tracker 得到了以下答案:

This is intended and part of the Material spec for Settings. See Material Design guide under 'Alignment'.