Экран настроек с помощью 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
}
}
Ответы
Ответ 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, можете ли вы опубликовать это, когда будете отвечать, поэтому я могу удалить эту копию вашего ответа.