2012-06-07 2 views
39

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

Это мой код

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 11 или выше. См. Https://github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC для примера поддержки «PreferenceFragment» на уровне API 11+ и классических предпочтений в старых версиях Android. – CommonsWare

+0

OK спасибо очень много! –

+11

@CommonsWare Можете ли вы повернуть свой комментарий как answrt, потому что это самый высокий голосующий «неотвеченный» вопрос – rds

ответ

3

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

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

10

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

См. this sample project для примера поддержки 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().

Смежные вопросы