2012-06-07 100 views
39

我在做一个使用ActionBarSherlock的Android应用程序。 我的问题是制作偏好屏幕。 SherlockPreferenceActivity类中的onBuildHeader()方法称为nerver。使用ActionBar的首选项屏幕Sherlock

这是我的代码

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 

    } 


} 
+27

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

+0

非常感谢! –

+11

@CommonsWare你可以把你的评论作为答案,因为这是最高的投票“未回答”的问题 – rds

回答

3

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

@CommonsWare可以请你发布此为你解答,这样我就可以删除你的答案的这个副本。

10

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

请参阅this sample project以获取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()的呼叫。