使用ActionBar Sherlock的首选项屏幕

我正在使用ActionBarSherlock做一个Android应用程序。 我的问题是制作偏好屏幕。 SherlockPreferenceActivity类上的onBuildHeader()方法被称为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 } } 

只有在API Level 11或更高版本上运行onBuildHeaders()时,才会调用onBuildHeaders() 。 在较旧的设备上,您可以回到传统的addPreferencesFromResource()方法。

有关支持API Level 11+上的PreferenceFragment和旧版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()的调用。

只有在API Level 11或更高版本上运行onBuildHeaders()时,才会调用onBuildHeaders()。 请参阅github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC以获取支持API Level 11+上的PreferenceFragment和旧版Android的经典偏好的示例。
– CommonsWare 12年6月7日在11:06

@CommonsWare可以请你回答这个问题,所以我可以删除你的答案的副本。