2010-01-27 19 views
6

Estoy probando mi aplicación en un Nexus One y tengo algunos problemas. Mi tema es Light y cuando se muestra una subpreferenceScreen interna, el fondo de la ventana se vuelve negro en lugar de mantener el de PreferenceActivity.Antecedentes de PreferenceActivity no se aplica a sub-PreferenceScreen

<PreferenceScreen android:title="main preferences"> 
    ... 
    <PreferenceScreen android:title="sub screen"> 
    </PreferenceScreen> 
</PreferenceScreen> 

¿Cuál es el problema?

Wouter

+0

¿Puedes mostrar una captura de pantalla de lo que parece antes de agregar la segunda PreferenceScreen y después? – CaseyB

+0

Esta es mi pantalla principal de preferencias http://snapplr.com/fqxc, así que cuando hago clic en "Herinneringen" (holandés para notificaciones) me aparece este http://snapplr.com/gjzd (Y no hay una flecha al lado de Herinneringen, donde debería haber uno!) ¿Cuál es el problema aquí? – wouter88

+0

¿Está cargando una nueva actividad o solo está inflando y superponiendo una vista? – CaseyB

Respuesta

1

Para entender mejor lo que está sucediendo aquí se puede referir a este pedazo de código a partir del código fuente de la clase PREFERENCE:

@Override 
    protected void onClick() { 
     if (getIntent() != null || getPreferenceCount() == 0) { 
      return; 
     } 

     showDialog(null); 
    } 

    private void showDialog(Bundle state) { 
     Context context = getContext(); 
     ListView listView = new ListView(context); 
     bind(listView); 

     // Set the title bar if title is available, else no title bar 
     final CharSequence title = getTitle(); 
     Dialog dialog = mDialog = new Dialog(context, TextUtils.isEmpty(title) 
       ? com.android.internal.R.style.Theme_NoTitleBar 
       : com.android.internal.R.style.Theme); 
     dialog.setContentView(listView); 
     if (!TextUtils.isEmpty(title)) { 
      dialog.setTitle(title); 
     } 
     dialog.setOnDismissListener(this); 
     if (state != null) { 
      dialog.onRestoreInstanceState(state); 
     } 

     // Add the screen to the list of preferences screens opened as dialogs 
     getPreferenceManager().addPreferencesScreen(dialog); 

     dialog.show(); 
    } 

La forma en que yo trabajo en torno a que es configurar el color de fondo principal anulando onCreateView en la primera preferencia agregada a la pantalla de preferencias. Por supuesto, esto requiere un poco de código personalizado pero no es terriblemente complicado, por ejemplo, para establecer un fondo blanco:

package com.justinbuser.livewallpapers; 

import android.preference.PreferenceCategory; 

public class VideoChooserPreferenceCategory extends PreferenceCategory{ 

    public VideoChooserPreferenceCategory(Context context) { 
     super(context); 
    } 

    @Override 
    protected View onCreateView(ViewGroup parent) 
    { 
     parent.setBackgroundColor(0xFFFFFFFF); 
     return super.onCreateView(parent); 
    } 
} 

A continuación, por supuesto, necesita usar esa categoría personalizada mediante la alteración de su XML, es decir:

<PreferenceScreen android:title="main preferences"> 
    <PreferenceScreen android:title="sub screen"> 
    <com.justinbuser.livewallpapers.VideoChooserPreferenceCategory android:title="sub screen category" /> 
    </PreferenceScreen> 
</PreferenceScreen> 

Además, si observa que la PreferenceScreen de Android cambia el tema en función de si se establece un título, es decir, si existe un título, habilita un tema que incluya la barra de título. Por lo tanto, si no desea una barra de título, debe evitar establecer el título de la pantalla de preferencias y configurarlo de forma estática en xml o dinámicamente a través del código.

2

Utilice esta:

Crear tema en el archivo style.xml

<style name="Theme.SettingsBackground" parent="@android:style/Theme.NoTitleBar"> 
<item name="android:windowBackground">@android:color/black</item> 
</style> 

y luego en uso archivo de manifiesto:

<activity android:name=".Settings" android:theme="@style/Theme.SettingsBackground"></activity> 

hacer esto para todas las actividades secundarias que desea.

+0

trabajado para mí, muchas gracias –

1

¿Has probado esto?

@Override 
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference){ 
     super.onPreferenceTreeClick(preferenceScreen, preference); 
     if (preference!=null) 
      if (preference instanceof PreferenceScreen) 
       if (((PreferenceScreen)preference).getDialog()!=null) 
        ((PreferenceScreen)preference).getDialog().getWindow().getDecorView().setBackgroundDrawable(this.getWindow().getDecorView().getBackground().getConstantState().newDrawable()); 
     return false; 
    } 

Agregue este método en su PreferenceActivity.

En el comentario # 35 de este source.

Cuestiones relacionadas