2012-06-07 8 views
39

Ich mache eine Android-Anwendung mit ActionBarSherlock. Mein Problem besteht darin, Präferenz Bildschirm zu machen. Die onBuildHeader() Methode an der SherlockPreferenceActivity Klasse wird nerver genannt.Einstellungen Bildschirm mit ActionBar Sherlock

Dies ist mein Code

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()' wird nur aufgerufen, wenn Sie auf API Level 11 oder höher laufen. Unter https://github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC finden Sie ein Beispiel für die Unterstützung von 'PreferenceFragment' in API Level 11+ und die klassischen Einstellungen in älteren Versionen von Android. – CommonsWare

+0

OK vielen Dank! –

+11

@CommonsWare Können Sie Ihren Kommentar als eine Antwort drehen, weil dies die höchste "unbeantwortete" Frage ist – rds

Antwort

3

onBuildHeaders() wird nur aufgerufen werden, wenn Sie auf API-Ebene 11 oder höher ausgeführt werden. Unter github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC finden Sie ein Beispiel für die Unterstützung von PreferenceFragment auf API Level 11+ und die klassischen Einstellungen älterer Android-Versionen.
- CommonsWare 7. Juni '12 bei 11:06

@CommonsWare Sie bitte poste diese, wie Sie antworten, so kann ich diese Kopie Ihrer Antwort löschen.

10

onBuildHeaders() wird nur aufgerufen, wenn Sie auf API Level 11 oder höher ausgeführt werden. Bei älteren Geräten sind Sie zurück zum klassischen addPreferencesFromResource() Ansatz.

Ein Beispiel für die Unterstützung von PreferenceFragment auf API Level 11+ und die klassischen Einstellungen älterer Android-Versionen finden Sie unter this sample project.

Insbesondere sieht seine SherlockFragmentActivity wie:

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); 
    } 
} 

In onCreate() wir nur tun müssen addPreferencesFromResource()wenn wir auf einem älteren Gerät sind. In diesem Fall hat mein Beispiel zwei Präferenz-Header und daher zwei XML-Präferenz-Dateien, so dass wir beide auf addPreferencesFromResource() aufrufen. Auf neueren Geräten führt onCreate() nichts als eine Kette zur Oberklasse, die den Aufruf an onBuildHeaders() auslöst.