設定をカスタマイズする   Part of Android Jetpack.

このトピックでは、階層の中の Preferences をカスタマイズする方法について説明します。

Preference の検索

Preference 値を取得したり設定したりするなど、個々の Preference にアクセスするには、PreferenceFragmentCompat.findPreference() を使用します。 このメソッドは、階層全体の中から、指定されたキーの Preference を検索します。

たとえば、キーが signature の EditTextPreference があるとして、

<EditTextPreference
        app:key="signature"
        app:title="Your signature"/>

この Preference は、次のコードを使用して取り出すことができます。

Kotlin

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource(R.xml.preferences, rootKey)
    val preference = findPreference("signature") as EditTextPreference
    // do something with this preference
}

Java

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.preferences, rootKey);
    EditTextPreference preference = (EditTextPreference) findPreference("signature");
    // do something with this preference
}

Preference の可視性を制御する

ユーザーが設定画面に移動する際に、どの Preferences を表示するか制御できます。 たとえば、特定の Preference は対応する機能が有効である場合にのみ意味がある場合、その機能が無効ならその Preference を非表示にするのがよいかもしれません。

条件を満たす場合にのみ Preference を表示するには、下の例に示されているように、まず XML の中で Preference の可視性を false に設定します。

<EditTextPreference
        app:key="signature"
        app:title="Your signature"
        app:isPreferenceVisible="false"/>

次に、onCreatePreferences() の中で、対応する条件が満たされている場合に Preference が表示されるようにします。

Kotlin

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource(R.xml.preferences, rootKey)
    if(*/\*some feature\*/*) {
        val preference = findPreference("signature")
        preference.isVisible = true
    }
}

Java

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.preferences, rootKey);
    if(*/\*some feature\*/*) {
        Preference editTextPreference = findPreference("signature");
        editTextPreference.setVisible(true);
    }
}

要約を動的に更新する

データを保持する Preference では、その summary (要約)の中で現在値を表示することにより、ユーザーが Preference の現在の状態をより良く把握できるようにしてください。 たとえば、EditTextPreference では現在保存されているテキスト値を表示しなければならず、ListPreference では現在選択されているリスト項目を表示する必要があります。 また、アプリの内部状態または外部状態に基づいて要約を更新する必要のある Preferences があるかもしれません。たとえば、バージョン番号を表示する Preference がそうです。 そのためには、SummaryProvider を使用することができます。

SimpleSummaryProvider を使用する

ListPreference および EditTextPreference には、保存されている Preference 値を要約として自動的に表示する、シンプルな SummaryProvider の実装が含まれています。 値が何も保存されていない場合は、「設定なし」と表示されます。

これらの実装は、XML で app:useSimpleSummaryProvider="true" を設定することにより有効にすることができます。

あるいは、次の例に示されているように、コード中に ListPreference.SimpleSummaryProvider.getInstance() および EditTextPreference.SimpleSummaryProvider.getInstance() を使用することにより、SummaryProvider のシンプルなインスタンスを取得した後、Preference でそれを設定することもできます。

Kotlin

listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()

Java

listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());

カスタム SummaryProvider を使用する

独自の SummaryProvider を作成し、provideSummary() をオーバーライドして、Preference によってリクエストされた時点で要約をカスタマイズすることができます。 たとえば、下の EditTextPreference では、保存されている値の長さが要約として表示されます。

たとえば、次の EditTextPreference があるとします。

<EditTextPreference
        app:key="counting"
        app:title="Counting preference"/>

onCreatePreferences() で新しい SummaryProvider を作成し、表示する要約を返すように provideSummary() をオーバーライドします。

Kotlin

val countingPreference = findPreference("counting") as EditTextPreference

countingPreference.summaryProvider = SummaryProvider<EditTextPreference> { preference ->
    val text = preference.text
    if (TextUtils.isEmpty(text)) {
        "Not set"
    } else {
        "Length of saved value: " + text.length
    }
}

Java

EditTextPreference countingPreference = (EditTextPreference) findPreference("counting");

countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() {
    @Override
    public CharSequence provideSummary(EditTextPreference preference) {
        String text = preference.getText();
        if (TextUtils.isEmpty(text)){
            return "Not set";
        }
        return "Length of saved value: " + text.length();
    }
});

Preference の要約は、保存値の長さを表示するか、保存されている値が存在しない場合には「設定なし」を表示するようになります 。

Preference のアクション

Preference には、タップ時の特定のアクションを 1 つ指定できます。 たとえば、Preference をアプリケーションの別の部分へのリンクとして動作するようにすることができます。 Preference にアクションを追加するには、Preference に直接 Intent を設定するか、またはさらに具体的なロジックのための OnPreferenceClickListener を設定することができます。

Intent を設定する

PreferenceIntent を設定することにより、Preference がタップされた時点で、新しい FragmentActivity、または別個のアプリケーションを起動することができます。 これは、指定された IntentContext.startActivity() を使用するのと同じことです。

ネストした <intent> タグを使用することにより、XML の中で Intent を設定することができます。 下の例では、Activity を起動する Intent を定義しています。

<Preference
        app:key=”activity”
        app:title="Launch activity">
    <intent
            android:targetPackage="com.example"
            android:targetClass="com.example.ExampleActivity"/>
</Preference>

または、下記に示されているように、Preference に対して直接 setIntent() を使用することもできます。

Kotlin

val intent = Intent(context, ExampleActivity::class.java)
activityPreference.setIntent(intent)

Java

Intent intent = new Intent(getContext(), ExampleActivity.class);
activityPreference.setIntent(intent);

また、XML で Intent に extra を含めることもできます。

<Preference
        app:key=”activity”
        app:title="Launch activity">
    <intent
            android:targetPackage="com.example"
            android:targetClass="com.example.ExampleActivity">
        <extra
                android:name="example_key"
                android:value="example_value"/>
    </intent>
</Preference>

ウェブページを表示する Intent を伴う Preference の例を以下に示します。

<Preference
        app:key=”webpage”
        app:title="View webpage">
    <intent
            android:action="android.intent.action.VIEW"
            android:data="http://www.google.com" />
</Preference>

Kotlin

val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("http://www.google.com")
webpagePreference.setIntent(intent)

Java

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
webpagePreference.setIntent(intent);

OnPreferenceClickListener

PreferenceOnPreferenceClickListener を設定して、Preference がタップされた時点で起動する onPreferenceClick() への callback を追加できます。 たとえば、ナビゲーション処理のためのロジックが複雑なものである場合、このリスナーを使用することにより、別の Fragment または Activity に移動することができます。

OnPreferenceClickListener を設定するには、次のようなコードを使用します。

Kotlin

onClickPreference.setOnPreferenceClickListener({
    // do something
    true
})

Java

onClickPreference.setOnPreferenceClickListener(preference -> {
    // do something
    return true;
});