Androidアプリ開発 Preference PreferenceActivity, PreferenceFragment, PreferenceFragmentCompatの違いを理解する

2016年11月13日(編集2016年11月13日)
このエントリーをはてなブックマークに追加

Androidアプリ開発で設定画面を作成するときは、Preferenceクラスを使用します。
この記事は、Androidアプリで設定画面を作成する方法を記載した記事です。

環境はAndroid 7.1 (API level 25) です。

環境

  • OS X El Capitan
  • android sdk 25
  • Oracle jdk version 1.8.0_72
  • Android Studio 2.2.2

難易度

初心者向け

サンプルコード

Android-Material-Design-Demo

Preference

Preferenceはアプリの設定画面を作成するために用意されたクラスです。

preference

少ないコード量で、データ保存を実現できるので、非常に便利です。
しかし、現在(sdk 25)では色々な派生クラスができていて、カオスな状態となっています。(まるでアニメーションクラスです)

この記事では、android sdk 25でのPreferenceの一般的な実装方法を記述します。

Activity

ActivityでPreferenceを利用するのが、もっとも一般的な方法です。
Preference用のアクティビティには、PreferenceActivityクラスが用意されています。
しかし、現在はPreferenceActivityでなく、PreferenceFragmentを使うことが推奨されています。 理由は、Fragmentの方が柔軟なアーキテクチャを持つアプリケーションを作成できるからです。なので、ActivityとFragmentを組み合わせてPreferenceを作成します。

Fragment

Preferenceで利用するFragmentには、PreferenceFragmentPreferenceFragmentCompatの2種類があります。
オススメは、Support LibraryであるPreferenceFragmentCompatです。
PreferenceFragmentCompatはPreferenceよりも多くのバージョンに対応できます。 Androidの開発では、Support Libraryを使うのが基本です。

インストール

Support Annotationsをインストールするには、build.gradleに次のように記述します。

{project_folder}/build.gradle
dependencies {
    compile 'com.android.support:preference-v7:25.0.0'
    compile 'com.android.support:preference-v14:25.0.0'
}
          

Preference Support Libraryにはv7とv14があります。Themeを変更する必要がある場合は、v14のインストールも必要となります。

ビルドをしてインストール後に、Preferenceの実装が可能になります。

PreferenceFragment実装

では、ここで一般的なアプリの設定画面を作成します。
まずはPreferenceのFragmentを実装します。
PreferenceFragmentCompatを継承したクラスを作成します。

{project_folder}/ui/PubSubActivity.java
public class PreferenceDemoFragment extends PreferenceFragmentCompat {

    private OnFragmentInteractionListener mListener;

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        // Load the preferences from an XML resource
        setPreferencesFromResource(R.xml.preferences, rootKey);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {}
}
        

preferences.xmlを実装します。

{project_folder}/res/xml/preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <SwitchPreferenceCompat
        android:defaultValue="false"
        android:key="red"
        android:summary="This is red."
        android:title="red" />
    <SwitchPreferenceCompat
        android:defaultValue="true"
        android:key="blue"
        android:summary="This is blue."
        android:title="blue" />
    <SwitchPreferenceCompat
        android:defaultValue="false"
        android:key="yellow"
        android:summary="This is yellow."
        android:title="yellow" />
</PreferenceScreen>
        

■ 実装の解説

1. PreferenceFragmentCompat継承

クラスは、android.support.v7.preference.PreferenceFragmentCompatを継承します。

public class PreferenceDemoFragment extends PreferenceFragmentCompat
        

PreferenceFragmentではありません。気をつけてください。

2. preferences.xmlをロード

設定を管理するファイルはpreferences.xmlです。以下のように読み込みます。

setPreferencesFromResource(R.xml.preferences, rootKey);
        

第1引数のxmlを読み込みます。

theme実装

themeの設定をします。styles.xmlのthemeにコードを追記します。

{project_folder}/res/values/styles.xml
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
    </style>
        

上記のthemeを設定しないと、以下のエラーがが発生してアプリがクラッシュします。

Caused by: java.lang.IllegalStateException: Must specify preferenceTheme in theme
        

Activity実装

fragmentをactivityと結合して画面を表示します。
activityを実装します。

{project_folder}/ui/PreferenceDemoActivity.java
public class PreferenceDemoActivity extends AppCompatActivity implements PreferenceDemoFragment.OnFragmentInteractionListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preference_demo);
    }
}
        

activity_preference_demo.xmlでfragmentを結合します。

{project_folder}/res/layout/activity_preference_demo.xml
    <fragment
        android:id="@+id/fragment_preference_demo"
        android:name="com.java_lang_programming.android_material_design_demo.ui.PreferenceDemoFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
        

■ 実装の解説

1. PreferenceDemoFragment.OnFragmentInteractionListener継承

クラスは、PreferenceDemoFragment.OnFragmentInteractionListenerを実装します。

public class PreferenceDemoActivity extends AppCompatActivity implements PreferenceDemoFragment.OnFragmentInteractionListener
        

ビルドと実行

実装を終えたら、ビルドしてアプリを実行します。

preference

Preference画面が表示されました。

まとめ

設定画面を作成するときは、なるべくPreference Support Libraryを使いましょう。
WEBアプリのように全てをデータベースに保存しないようにしてください。

関連記事

タグ検索で調べてみよう

Android7.0 UI