自訂設定 Android Jetpack 的一部分。

本文說明如何自訂 Preference 物件。

尋找偏好設定

如要存取個別 Preference (例如取得或設定 Preference 值時),請使用 PreferenceFragmentCompat.findPreference()。這個方法會在整個階層中搜尋具有給定索引鍵的 Preference

舉例來說,如要存取 EditTextPreference,其中包含 鍵 "signature",請進行以下操作:

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

使用下列程式碼擷取此 Preference

KotlinJava
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource
(R.xml.preferences, rootKey)
   
val signaturePreference: EditTextPreference? = findPreference("signature")
   
// Do something with this preference.
}
@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 在 XML 中將瀏覽權限設為 false,如以下範例所示:

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

onCreatePreferences() 中顯示 Preference,且應對應 條件相符:

KotlinJava
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource
(R.xml.preferences, rootKey)
   
if(/*some feature*/) {
       
val signaturePreference: EditTextPreference? = findPreference("signature")
        signaturePreference
?.isVisible = true
   
}
}
@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,則必須在其中顯示目前值 摘要 可讓使用者更加瞭解 Preference。舉例來說,EditTextPreference 必須顯示儲存的文字 值,ListPreference 必須顯示所選清單項目。您可能也會發現 Preference 個物件需要根據內部或 外部應用程式狀態,例如顯示版本的 Preference 號碼。方法是使用 SummaryProvider

使用 SimpleSummaryProvider

ListPreferenceEditTextPreference 包含簡單的 SummaryProvider 實作,其自動顯示儲存的 Preference 值做為摘要。如未儲存任何值,則會顯示「不」 設定。」

如要從 XML 啟用這些實作項目,請設定 app:useSimpleSummaryProvider="true"

另外,在程式碼中,您可以使用 ListPreference.SimpleSummaryProvider.getInstance()敬上 和 EditTextPreference.SimpleSummaryProvider.getInstance()。 取得簡易的 SummaryProvider 例項,然後在該執行個體上設定 Preference,如以下範例所示:

KotlinJava
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference
.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
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() 即可傳回要顯示的摘要:

KotlinJava
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
   
}
}
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,當 內容。

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

numberPreference
?.setOnBindEditTextListener { editText ->
    editText
.inputType = InputType.TYPE_CLASS_NUMBER
}
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 上設定 Intent,或者 可以設定 OnPreferenceClickListener敬上 提供更具體的邏輯

設定意圖

您可以在 Preference 上設定 Intent 以啟動新的 FragmentActivity 或個別應用程式。Preference這是 等同於使用 Context.startActivity()敬上 指定的 Intent

您可以使用巢狀 <intent> 標記在 XML 中設定 Intent。下列 範例會定義啟動 ActivityIntent

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

或者,您也可以直接在 Preference 上使用 setIntent(),如下所示:

KotlinJava
val intent = Intent(context, ExampleActivity::class.java)
activityPreference
.setIntent(intent)
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>

以下是具有 IntentPreference 範例,其可啟動網頁:

<Preference
       
app:key="webpage"
       
app:title="View webpage">
   
<intent
           
android:action="android.intent.action.VIEW"
           
android:data="http://www.google.com" />
</Preference>
KotlinJava
val intent = Intent(Intent.ACTION_VIEW)
intent
.data = Uri.parse("http://www.google.com")

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

OnPreferenceClickListener

您可以在 Preference 上設定 OnPreferenceClickListener,其會加入 輕觸 Preference 時呼叫 onPreferenceClick()。例如: 你可以使用事件監聽器前往其他 FragmentActivity (如有) 處理導覽時也較複雜

如要設定 OnPreferenceClickListener,可以使用類似於以下內容的程式碼:

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