39 votes

Écran de préférences utilisant ActionBar Sherlock

Je fais une application Android en utilisant ActionBarSherlock . Mon problème est de faire un écran de préférence. Le site onBuildHeader() sur la méthode SherlockPreferenceActivity La classe n'est pas appelée.

Voici mon 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>

préférences.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>

MaPréférenceActivité

public class MyPreferenceActivity extends SherlockPreferenceActivity {

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

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

}

MonFragmentDePréférence

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

    }

}

10voto

CommonsWare Points 402670

onBuildHeaders() ne sera appelé que si vous utilisez le niveau 11 de l'API ou un niveau supérieur. Sur les appareils plus anciens, vous revenez au classique addPreferencesFromResource() approche.

Voir cet exemple de projet pour un exemple de soutien PreferenceFragment sur le niveau 11+ de l'API et les préférences classiques sur les anciennes versions d'Android.

Plus précisément, son SherlockFragmentActivity ressemble :

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

Sur onCreate() nous devons uniquement faire addPreferencesFromResource() si nous sommes sur un appareil plus ancien. Dans ce cas, mon échantillon a deux en-têtes de préférence, et donc deux fichiers XML de préférence, donc nous appelons addPreferencesFromResource() sur les deux. Sur les appareils plus récents, onCreate() ne fait rien d'autre que de chaîner à la superclasse, ce qui déclenchera l'appel à la fonction onBuildHeaders() .

3voto

erbsman Points 840

onBuildHeaders() ne sera appelé que si vous utilisez le niveau 11 de l'API ou une version supérieure. Voir github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC pour un exemple de prise en charge de PreferenceFragment au niveau 11+ de l'API et des préférences classiques sur les anciennes versions d'Android.
- CommonsWare 7 juin 12 à 11:06

@CommonsWare pouvez-vous s'il vous plaît poster ceci comme votre réponse, afin que je puisse supprimer cette copie de votre réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X