設定をカスタマイズする Android Jetpack の一部。

このドキュメントでは、カスタマイズの方法について説明します。 階層内の Preference オブジェクト。

設定を見つける

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

たとえば、 EditTextPreference と キーに "signature" を付けるには、次の操作を行います。

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

次のコードを使用して、この Preference を取得します。

Kotlin

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

Java

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

Preference の表示を制御する

どの Preference オブジェクトをどのタイミングでユーザーに表示するかを管理できます。 設定画面に移動しますたとえば特定の Preference が、対応する機能が有効な場合にのみ意味を持つ場合、その機能が無効な場合にはその Preference を非表示にすることをおすすめします。

条件が満たされた場合にのみ Preference を表示するには、まず 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 signaturePreference: EditTextPreference? = findPreference("signature")
        signaturePreference?.isVisible = true
    }
}

Java

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

サマリーを動的に更新する

データを保持する Preference は、現在の値を summary: ユーザーが現在のステータスを Preference。たとえば、EditTextPreference は保存されたテキストを表示する必要があります。 ListPreference は選択されたリストエントリを表示する必要があります。また、 内部または基づいてサマリーを更新する必要がある Preference オブジェクトがある 外部アプリの状態(バージョンを表示する 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 の例を示す画像
図 1. (EditTextPreference の例)。

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

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

onCreatePreferences() では、新しい SummaryProvider を作成してオーバーライドできます。 provideSummary() は、表示するサマリーを返します。

Kotlin

val countingPreference: EditTextPreference? = findPreference("counting")

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

Java

EditTextPreference countingPreference = findPreference("counting");

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

Preference の概要に、保存された値の長さまたは「未設定」が表示されます。 保存された値が存在しない場合です。

EditTextPreference ダイアログをカスタマイズする

EditTextPreference ダイアログ内で、次の方法でテキスト フィールドの動作をカスタマイズできます。 添付しています OnBindEditTextListener。 このリスナーは、ユーザーにダイアログが表示されたときに呼び出されます。

たとえば、数字のみを受け入れるようにダイアログをカスタマイズできます。まずは EditTextPreference:

<EditTextPreference
        app:key="number"
        app:title="Numbers only preference"/>

次に、onCreatePreferences() で新しい OnBindEditTextListener を作成します。 オーバーライド onBindEditText() を使用して、EditText がユーザーに できます。

Kotlin

val numberPreference: EditTextPreference? = findPreference("number")

numberPreference?.setOnBindEditTextListener { editText ->
    editText.inputType = InputType.TYPE_CLASS_NUMBER
}

Java

EditTextPreference numberPreference = findPreference("number");

if (numberPreference != null) {
    numberPreference.setOnBindEditTextListener(
            new EditTextPreference.OnBindEditTextListener() {
                @Override
                public void onBindEditText(@NonNull EditText editText) {
                    editText.setInputType(InputType.TYPE_CLASS_NUMBER);
                }
            });
}

これで、ダイアログがユーザーに表示されるときに、キーボードが数字のみで開きます モードに設定されるため、ユーザーは EditText に数字のみを入力できます。

Preference のアクション

Preference には、タップされたときの特定のアクションを設定できます。たとえば、 Preference は、アプリの別の部分へのリンクとして機能します。アクションを追加するには Preference に設定するには、Preference で Intent を直接設定するか、 以下を設定できます OnPreferenceClickListener をご覧ください。

Intent を設定する

Preference で Intent を設定して、新しい Fragment を起動できます。 Activity、または Preference がタップされるたびに個別のアプリを作成します。これが 使用するのと同じように、 Context.startActivity() 特定のIntentで

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 にエクストラを含めることもできます。

<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")

val webpagePreference = findPreference("webpage")
webpagePreference?.intent = intent

Java

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

OnPreferenceClickListener

Preference で OnPreferenceClickListener を設定すると、 Preference がタップされたときの onPreferenceClick() へのコールバック。たとえば 次の場合に、リスナーを使用して別の Fragment または Activity に移動できます。 ナビゲーションを処理するためのより複雑なロジックが必要です。

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

Kotlin

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

Java

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