web-dev-qa-db-ja.com

v7 / v14プリファレンスサポートライブラリの使用方法

Mリリースと一緒に、新しいサポートライブラリがあります。非常に有用と思われるものの1つは、 v7 Preference Support ライブラリです。

PreferenceActivityまたは同様のものはないようですが、アプリにどのように統合しますか?

53

フラグメントに必要な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>
92
hidro

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>
12
Junyue Cao

新しい設定サポートライブラリv7では、任意のActivityまたはAppCompatActivityPreferenceFragmentCompat を使用できます。

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をカスタマイズして、各設定タイプに使用されるレイアウトのスタイルを設定できます。

9

上記の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>

他の人が同じ例外に遭遇した場合に役立つ可能性があるため、ここに投稿します

0
QuantumTiger

確かにappcompat v7には存在しませんが、Googleは実際にAppCompatDelegate抽象クラスをデリゲートとして追加し、アクティビティにAppCompatのサポートを注入できます。 this answer からさらに見つけることができます。

これは、GoogleのAppCompatのサンプルからアクティビティにAppCompatDelegateを注入する方法の例です。見つけることができます here

0
Ahmed Hegazy