偏好设置屏幕使用 ActionBar Sherlock

39

我正在使用 ActionBarSherlock 开发 Android 应用程序。

我的问题是如何创建首选项屏幕。在 SherlockPreferenceActivity 类中,onBuildHeader() 方法从未被调用。

这是我的代码:

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>

我的PreferenceActivity

public class MyPreferenceActivity extends SherlockPreferenceActivity {


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

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

}

我的PreferenceFragment

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
只有在运行于API Level 11或更高版本时,才会调用onBuildHeaders()。请参考https://github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC,了解如何在API Level 11+上支持PreferenceFragment并在旧版Android上支持经典偏好设置的示例。 - CommonsWare
2个回答

10

onBuildHeaders()方法只会在您运行于API Level 11或更高级别的设备上调用。对于老旧的设备,您需要使用经典的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()


3
如果您正在运行API Level 11或更高版本,则只会调用onBuildHeaders()。请参阅github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC,了解在API Level 11+上支持PreferenceFragment以及在旧版Android上支持经典偏好设置的示例。
- CommonsWare Jun 7 '12 at 11:06

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接