После того, как перешёл на target API 22 и стал использовать соответствующий AppCompat, заметил, что в PreferenceActivity на Android 4.+ стали неправильно отображаться чекбоксы. Они отображались чёрным цветом, в то время как должны были быть бледно-голубыми, как на Lollipop:
Причина была в том, что я использовал PreferenceActivity в устаревшем
(начиная с API 21)
режиме, добавляя xml-ку настроек через метод addPreferencesFromResource
в самом
активити. Сейчас такой режим больше не поддерживается.
Правильный подход, в том числе с использованием headers, описан в документации к PreferenceActivity. Если вкратце, то нужно использовать PreferenceFragment. И его можно будет добавлять в любом Activity. В самом простом виде это выглядит так:
public class MyPrefsActivity : Activity()
{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.simple_frame)
getFragmentManager()
.beginTransaction()
.replace(R.id.Simple_Root, MyPrefsFragment())
.commit()
}
}
public class MyPrefsFragment : PreferenceFragment()
{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
addPreferencesFromResource(R.xml.preferences)
}
}
Однако PreferenceFragment появился лишь в API 11, и если необходимо поддерживать
более ранние версии, нужно искать кастомный PreferenceFragment, так как
Support Library для Android такого класса почему-то не имеет. Лично я использую
PreferenceFragment от kolavar. Подключаем его как модуль (там есть ресурсы), правим импорт в
классе MyPrefsFragment
, и корректируем MyPrefsActivity
:
public class MyPrefsActivity : ActionBarActivity()
{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.simple_frame)
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.Simple_Root, MyPrefsFragment())
.commit()
}
}
Готово. Теперь даже можно стилезовать эти чекбоксы под общий дизайн
с помощью указания аттрибута colorAccent
в теме приложения:
<style name="AppTheme" parent="Theme.AppCompat">
...
<item name="colorAccent">@color/color_accent</item>
</style>