2012-06-07 36 views
39

Estoy haciendo una aplicación de Android usando ActionBarSherlock. Mi problema es hacer una pantalla de preferencias. El método onBuildHeader() en la clase SherlockPreferenceActivity es llamado nerver.Pantalla de preferencias usando ActionBar Sherlock

Este es mi código

preference_headers.xml

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" > 
<header 
    android:fragment="package.fragments.MyPreferenceFragment" 
    android:icon="@drawable/bulle" 
    android:summary="An example of some preferences." 
    android:title="title" /> 

</preference-headers> 

preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
    android:title="@string/options" > 

    <PreferenceCategory> 
     <SwitchPreference 
      android:id="@+id/cb_notif" 
      android:defaultValue="false" 
      android:key="com.vincent.HTC_Dev.pref.notif" 
      android:summaryOff="@string/notifications_off" 
      android:summaryOn="@string/notifications_on" 
      android:title="@string/notifications" /> 
    </PreferenceCategory> 

</PreferenceScreen> 

MyPreferenceActivity

public class MyPreferenceActivity extends SherlockPreferenceActivity { 


    @Override 
    public void onBuildHeaders(List<Header> target) { 
     super.onBuildHeaders(target); 

     loadHeadersFromResource(R.xml.preference_headers, target); 
    } 

} 

MyPreferenceFragment

public class MyPreferenceFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     addPreferencesFromResource(R.xml.preferences); 
     getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
      String key) { 
     // TODO Auto-generated method stub 

    } 


} 
+27

'onBuildHeaders()' solo se ejecutará si está ejecutando el API Nivel 11 o superior. Consulte https://github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC para obtener un ejemplo de compatibilidad con 'PreferenceFragment' en API Level 11+ y preferencias clásicas en versiones anteriores de Android. – CommonsWare

+0

OK ¡muchas gracias! –

+11

@CommonsWare Puede convertir su comentario en una respuesta, porque esta es la pregunta "sin respuesta" más votada – rds

Respuesta

3

onBuildHeaders() sólo serán llamados si está ejecutando en el nivel API 11 o superior. Consulte github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC para ver un ejemplo de compatibilidad con PreferenceFragment en API Level 11+ y preferencias clásicas en versiones anteriores de Android.
- CommonsWare Jun 7 '12 a 11:06

@CommonsWare puede usted por favor, puesto esto como su respuesta, por lo que puede eliminar esta copia de su respuesta.

10

onBuildHeaders() solo se ejecutará si está ejecutando API Nivel 11 o superior. En dispositivos más antiguos, vuelve al clásico addPreferencesFromResource().

Consulte this sample project para obtener un ejemplo de compatibilidad con PreferenceFragment en API Nivel 11+ y preferencias clásicas en versiones anteriores de Android.

En concreto, su SherlockFragmentActivity parece:

package com.commonsware.android.preffragsbc; 

import java.util.List; 
import android.os.Build; 
import android.os.Bundle; 
import com.actionbarsherlock.app.SherlockPreferenceActivity; 

public class EditPreferences extends SherlockPreferenceActivity { 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (Build.VERSION.SDK_INT<Build.VERSION_CODES.HONEYCOMB) { 
     addPreferencesFromResource(R.xml.preferences); 
     addPreferencesFromResource(R.xml.preferences2); 
    } 
    } 

    @Override 
    public void onBuildHeaders(List<Header> target) { 
    loadHeadersFromResource(R.xml.preference_headers, target); 
    } 
} 

En onCreate() tenemos que solamente hacemos addPreferencesFromResource() si estamos en un dispositivo antiguo. En este caso, mi muestra tiene dos encabezados de preferencia y, por lo tanto, dos archivos XML de preferencia, por lo que llamamos al addPreferencesFromResource() en ambos. En dispositivos más nuevos, onCreate() no hace más que encadenar a la superclase, lo que disparará la llamada al onBuildHeaders().

Cuestiones relacionadas