Я перешел на библиотеки androidx. *, И одна из них - новая библиотека настроек: androidx.preference:preference:1.1.0-alpha01
- последняя версия.
Как сказано в заметках о выпуске 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), он работает нормально, но в противном случае место для значка зарезервировано.Кроме того, docs говорит, что по умолчанию это false
:
По умолчанию видимость значка настроек предпочтения будет установлена на GONE, если значок отсутствует, поэтому значение по умолчаниюэтот атрибут имеет значение false.
Это новая ошибка в этой библиотеке или новая возможность оставлять место для значка, если он не установлен?Или я что-то не так делаю?
Я знаю об обходных путях:
Редактировать:
После просмотра источников я нашел следующую вещь.
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
здесь.