2012-06-07 14 views
39

Sto facendo un'applicazione Android utilizzando ActionBarSherlock. Il mio problema è di creare una schermata di preferenza. Il metodo onBuildHeader() sulla classe SherlockPreferenceActivity viene chiamato nervatore.Schermata delle preferenze utilizzando ActionBar Sherlock

Questo è il mio codice

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()' sarà chiamato solo se si sta eseguendo su API di livello 11 o superiore. Vedi https://github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC per un esempio di supporto di 'PreferenceFragment' su API di livello 11+ e preferenze classiche su versioni precedenti di Android. – CommonsWare

+0

OK grazie mille! –

+11

@CommonsWare Riesci a trasformare il tuo commento come un rispondente, perché questa è la più votata "senza risposta" domanda – rds

risposta

3

onBuildHeaders() saranno chiamati solo se si esegue su API livello 11 o superiore. Vedi github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC per un esempio di supporto di PreferenceFragment su API di livello 11+ e preferenze classiche su versioni precedenti di Android.
- CommonsWare 7 giugno '12 a 11:06

@CommonsWare può si prega di inviare questo come si risponde, così posso eliminare la copia della tua risposta.

10

onBuildHeaders() verrà chiamato solo se si esegue su API di livello 11 o superiore. Sui dispositivi più vecchi, si torna al classico approccio addPreferencesFromResource().

Vedere this sample project per un esempio di supporto PreferenceFragment su livello API 11+ e preferenze classiche su versioni precedenti di Android.

In particolare, la sua SherlockFragmentActivity assomiglia:

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() abbiamo bisogno di solo facciamo addPreferencesFromResource()se siamo su un dispositivo più vecchio. In questo caso, il mio esempio ha due intestazioni di preferenza, e quindi due file XML di preferenza, quindi chiamiamo addPreferencesFromResource() su entrambi. Sui dispositivi più recenti, onCreate() non fa altro che incatenare alla superclasse, che attiverà la chiamata a onBuildHeaders().

Problemi correlati