Подтвердить что ты не робот

Экран настроек с помощью ActionBar Sherlock

Я использую приложение для Android с помощью ActionBarSherlock. Моя проблема заключается в настройке экрана предпочтений. Метод onBuildHeader() в классе SherlockPreferenceActivity называется 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

    }


}
4b9b3361

Ответ 1

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

См. этот примерный проект для примера поддержки 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().

Ответ 2

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

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