Экран настроек с помощью ActionBar Sherlock

Я использую приложение Android с помощью ActionBarSherlock . Моя проблема заключается в том, чтобы сделать экран предпочтений. Метод onBuildHeader() класса SherlockPreferenceActivity называется nerver.

Это мой код

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

Solutions Collecting From Web of "Экран настроек с помощью ActionBar Sherlock"

onBuildHeaders() только если вы работаете на уровне API 11 или выше. На старых устройствах вы возвращаетесь к классическому addPreferencesFromResource() .

См. Этот пример проекта для примера поддержки PreferenceFragment на уровне API 11+ и классических предпочтений в старых версиях Android.

В частности, его SherlockFragmentActivity выглядит так:

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

В onCreate() нам нужно только делать addPreferencesFromResource() если мы находимся на более старом устройстве. В этом случае моя выборка имеет два заголовка предпочтений и, следовательно, два файла XML предпочтений, поэтому мы вызываем addPreferencesFromResource() для обоих из них. На новых устройствах onCreate() ничего не делает, кроме цепочки для суперкласса, который вызовет вызов onBuildHeaders() .

OnBuildHeaders () вызывается только если вы работаете на уровне API 11 или выше. См. Github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC для примера поддержки PreferenceFragment на уровне API 11+ и классических предпочтений в старых версиях Android.
– CommonsWare Jun 7 '12 в 11:06

@CommonsWare, можете ли вы опубликовать это, когда будете отвечать, поэтому я могу удалить эту копию вашего ответа.