web-dev-qa-db-ja.com

ActionBarSherlockを使用した設定画面

ActionBarSherlockを使用してAndroidアプリケーションを実行しています。私の問題は、設定画面を作成することです。SherlockPreferenceActivityクラスのonBuildHeader()メソッド神経質と呼ばれています。

これは私のコードです

preferences_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

    }


}

onBuildHeaders()は、APIレベル11以上で実行している場合にのみ呼び出されます。古いデバイスでは、従来のaddPreferencesFromResource()アプローチに戻ります。

APIレベル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()では、onlydo addPreferencesFromResource()if古いデバイスを使用しています。この場合、私のサンプルには2つの設定ヘッダーがあり、したがって2つの設定XMLファイルがあるため、両方でaddPreferencesFromResource()を呼び出します。新しいデバイスでは、onCreate()はスーパークラスにチェーンするだけで、onBuildHeaders()の呼び出しがトリガーされます。

10
CommonsWare

onBuildHeaders()は、APIレベル11以降で実行している場合にのみ呼び出されます。 APIレベル11以降でPreferenceFragmentをサポートし、古いバージョンのAndroidで従来の設定をサポートする例については、github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBCを参照してください。
– CommonsWare 2012年6月7日11:06

@CommonsWareはあなたが答えるときにこれを投稿してくれませんか?私はあなたの答えのこのコピーを削除することができます。

3
erbsman