設定をカスタマイズする 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 を使用する

ListPreferenceEditTextPreference には、保存されている 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 に設定するには、PreferenceIntent を直接設定するか、 以下を設定できます OnPreferenceClickListener をご覧ください。

Intent を設定する

PreferenceIntent を設定して、新しい 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>

または、次のように PreferencesetIntent() を直接使用することもできます。

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

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

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

Kotlin

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

Java

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