Обновление AppCompat и чёрные чекбоксы в PreferenceActivity

После того, как перешёл на target API 22 и стал использовать соответствующий AppCompat, заметил, что в PreferenceActivity на Android 4.+ стали неправильно отображаться чекбоксы. Они отображались чёрным цветом, в то время как должны были быть бледно-голубыми, как на Lollipop:

Black Checkboxes in PreferenceActivity

Причина была в том, что я использовал 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>