Mリリースと一緒に、新しいサポートライブラリがあります。非常に有用と思われるものの1つは、 v7 Preference Support ライブラリです。
PreferenceActivity
または同様のものはないようですが、アプリにどのように統合しますか?
フラグメントに必要なAppCompatActivity
を拡張し、 PreferenceFragmentCompat
のサブクラスを含める必要があります。抽象フラグメントでは、プリファレンスインフレーションロジックを配置する必要がある1つのメソッドをオーバーライドする必要があります。最後に、アクティビティテーマでpreferenceTheme
属性を指定する必要があります。
お知らせを読む here 。 preference-v7ライブラリを使用すると、PreferenceFragment
(API 11+)をPreferenceFragmentCompat
サブクラスに、SwitchPreference
(API 14+)を SwitchPreferenceCompat
に置き換えることができますAPI 7から設定画面が機能するようにします。
以下は私がそれを機能させた方法です:
SettingsActivity.Java
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
}
}
layout/activity_settings.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent" Android:layout_height="match_parent" >
<fragment
Android:name=".SettingsFragment"
Android:tag=".SettingsFragment"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
</FrameLayout>
SettingsFragment.Java
public class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.preferences);
}
}
xml/preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.preference.PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent" Android:layout_height="match_parent">
<Android.support.v7.preference.PreferenceCategory
...>
<Android.support.v7.preference.ListPreference
... />
<Android.support.v7.preference.SwitchPreferenceCompat
... />
...
</Android.support.v7.preference.PreferenceCategory>
...
</Android.support.v7.preference.PreferenceScreen>
values/styles.xml
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
...
</style>
preference-v7 default theme
<style name="PreferenceThemeOverlay">
<item name="preferenceScreenStyle">@style/Preference.PreferenceScreen</item>
<item name="preferenceFragmentStyle">@style/PreferenceFragment</item>
<item name="preferenceCategoryStyle">@style/Preference.Category</item>
<item name="preferenceStyle">@style/Preference</item>
<item name="preferenceInformationStyle">@style/Preference.Information</item>
<item name="checkBoxPreferenceStyle">@style/Preference.CheckBoxPreference</item>
<item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat</item>
<item name="dialogPreferenceStyle">@style/Preference.DialogPreference</item>
<item name="editTextPreferenceStyle">@style/Preference.DialogPreference.EditTextPreference</item>
<item name="preferenceFragmentListStyle">@style/PreferenceFragmentList</item>
</style>
hidroの答えは正しいですが、ここでもう1つ注意すべき点があります。
完全なクラス名の代わりにPreferenceScreen
などの通常の設定xmlタグを使用します。サポートライブラリはそれらを自動的に変換します。
理由:完全なクラス名を使用すると、コードの提案とレイアウトのプレビューが正しく機能しません。
したがって、次のようにxmlを作成する必要があります。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
<PreferenceCategory
...>
<ListPreference
... />
<SwitchPreferenceCompat
... />
...
</PreferenceCategory>
...
</PreferenceScreen>
新しい設定サポートライブラリv7では、任意のActivity
またはAppCompatActivity
で PreferenceFragmentCompat を使用できます。
public static class PrefsFragment extends PreferenceFragmentCompat {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
}
テーマにpreferenceTheme
を設定する必要があります。
<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
...
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>
このようにして、アクティビティの他の部分に影響を与えることなく、preferenceTheme
をカスタマイズして、各設定タイプに使用されるレイアウトのスタイルを設定できます。
上記のHidroの回答をツールバーを含むアクティビティで実装しようとしましたが、次のエラーのためにレイアウトインフレーション例外が発生しました。
原因:Java.lang.NullPointerException:nullオブジェクト参照で仮想メソッド 'Android.content.Context Android.support.v4.app.FragmentHostCallback.getContext()'を呼び出そうとしました
私はこれらを解決することができませんでしたので、以下に頼りました:
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState == null)
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, new SettingsFragment()).commit();
}
}
SettingsActivityの次のレイアウト:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<include layout="@layout/toolbar"/>
<FrameLayout Android:id="@+id/fragment_container"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</Android.support.design.widget.CoordinatorLayout>
他の人が同じ例外に遭遇した場合に役立つ可能性があるため、ここに投稿します
確かにappcompat v7には存在しませんが、Googleは実際にAppCompatDelegate
抽象クラスをデリゲートとして追加し、アクティビティにAppCompatのサポートを注入できます。 this answer からさらに見つけることができます。
これは、GoogleのAppCompatのサンプルからアクティビティにAppCompatDelegate
を注入する方法の例です。見つけることができます here 。