Cambiar el color de resaltado y título de los fragmentos en PreferenceActivity

Estoy usando el tema Material, y me gustaría cambiar el color de las dos áreas marcadas en la imagen de abajo, es decir, el color de resaltado (# 1) y el color del título en el fragmento de detalles (# 2).

Sé que hay un atributo para el color de cada uno en el tema, pero no puedo encontrarlo.

Introduzca aquí la descripción de la imagen

¿Algunas ideas?

Sé que hay un atributo para el color de cada uno en el tema, pero no puedo encontrarlo.

Número de artículo 1

El atributo que deseará está activatedBackgroundIndicator .

Según los documentos

Dibujable utilizado como fondo para los elementos activados.

Razón de ser

El diseño utilizado para cada elemento de encabezado en una PreferenceActivity es preference_header_item_material que utiliza el activatedBackgroundIndicator como fondo. Necesitará un selector para este atributo, algo así como:

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true"><color android:color="yourColor" /> </item> <item><color android:color="@android:color/transparent" /> </item> </selector> 

Número de artículo 2

Este artículo es ligeramente más complicado. No es un PreferenceScreen como usted sugirió en la otra respuesta, pero el FragmentBreadCrumbs título. Desafortunadamente, el color del título no se puede establecer usando un tema porque el atributo utilizado para estilo es privado interno.

Sin embargo, puede establecer el color del texto con Reflection o simplemente cruzando la jerarquía de vista de la TextView hasta que encuentre TextView utilizado para mostrar el título.

El diseño utilizado para mostrar el contenido de cada PreferenceActivity es preference_list_content_material que incluye el diseño breadcrumbs_in_fragment_material para mostrar cada breadcrumb. Usted puede ver desde ese diseño que el ID de cada FragmentBreadCrums es android:id/title . Ahora podemos usar este id para encontrar el breadcrumb y ajustar el TextView dentro de él.

Uso de la reflexión

 @Override public void onBuildHeaders(List<Header> target) { super.onBuildHeaders(target); loadHeadersFromResource(R.xml.yourPreferenceHeaders, target); final View breadcrumb = findViewById(android.R.id.title); if (breadcrumb == null) { // Single pane layout return; } try { final Field titleColor = breadcrumb.getClass().getDeclaredField("mTextColor"); titleColor.setAccessible(true); titleColor.setInt(breadcrumb, yourTitleColor); } catch (final Exception ignored) { // Nothing to do } } 

Desplazamiento de la jerarquía de vistas

Usar View.findViewsWithText es una manera fácil de manejar esto.

  breadcrumb.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { breadcrumb.getViewTreeObserver().removeOnGlobalLayoutListener(this); final ArrayList<View> outViews = Lists.newArrayList(); breadcrumb.findViewsWithText(outViews, getString(R.string.your_header_title), View.FIND_VIEWS_WITH_TEXT); ((TextView) outViews.get(0)).setTextColor(yourTitleColor); } }); 

Resultados

Resultados

  • ¿Cómo puedo encontrar lo que android: attr / listChoiceIndicatorSingle apunta a?
  • Temas: ¿Depende del tema dibujable?
  • Cómo configurar el holo tema oscuro en una aplicación de Android?
  • Crear tema personalizado descargable y aplicarlo durante el tiempo de ejecución
  • ¿Cuándo se debe usar Theme.AppCompat vs ThemeOverlay.AppCompat?
  • Android Material Design: No se pudo encontrar el estilo 'toolbarStyle' en el tema actual
  • ¿Qué hace el AppBaseTheme en las aplicaciones Android
  • Barra de acción plana con Theme.Material
  • Personalizar temas que no funcionan
  • ¿Cómo usar el tema predeterminado del dispositivo para la aplicación?
  • ¿Qué atributos de tema necesito anular para cambiar el color de resaltado azul de mis cuadros de diálogo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.