使用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可以请你回答这个问题,所以我可以删除你的答案的副本。