Android:在主要首选项屏幕中将首选项的摘要设置为在子首选项屏幕中选择的值

时间:2013-08-08 10:34:14

标签: android preferences summary

我的要求

  • 拥有一个充满首选项的主屏幕(main_screen)
  • 点击此main_screen中的一个首选项(pref1)会打开一个 子屏幕设置(子屏幕)
  • 在此子屏幕中,当用户时有2个ListPreferences 从这些列表中选择一个值,即ListPreference的摘要 已更新为包含用户选择的值
  • 在main_screen中,pref1的摘要应显示值 在子屏幕的listPreferences中选择(即摘要具有 List1SelectedValue,List2SelectedValue)
  • 第一次进入main_screen时,摘要为 应填充pref1
  • 转到sub_screen并更改值,然后 返回主屏幕时,应更新摘要以反映 sub_screen中新选择的值。

我已经四处寻找,我无法弄清楚如何将主屏幕上pref1的摘要设置为在sub_screen中选择的值。

示例main_screen xml

<PreferenceScreen>

    <PreferenceCategory
        style="@style/settings_category_text"
        android:title="Section 1 Heading" >

        <Preference
            android:key="section1_key1"
            android:title="Pref 1">
        </Preference>

    </PreferenceCategory>

    <PreferenceCategory
        style="@style/settings_category_text"
        android:key="extra_settings_category"
        android:title="Section 2 Heading" >

        <PreferenceScreen
            android:key="sub_screen"
            android:title="Sub screen of settings"
            android:summary=""> 
            <intent
                android:targetPackage="com.my.test"
                android:targetClass="com.my.test.SubScreenPreferenceActivity" />
    </PreferenceScreen>

    </PreferenceCategory>    

</PreferenceScreen>

示例sub_screen xml

<PreferenceScreen>

    <PreferenceCategory
        style="@style/settings_category_text"
        android:title="Additional Settings" >

        <ListPreference
            android:key="list_pref1"
            android:title="List Pref 1"
            android:defaultValue="1"
            android:entries="@array/list_pref1_titles"
            android:entryValues="@array/list_pref1_values"
            android:summary="%s"
        />

        <ListPreference
            android:key="list_pref2"
            android:title="List Pref 2"
            android:defaultValue="1"
            android:entries="@array/list_pref2_titles"
            android:entryValues="@array/list_pref2_values"
            android:summary="%s"
        />        
    </PreferenceCategory>

</PreferenceScreen>

sub_screen中列表值的示例数组

<string-array name="list_pref1_titles">
    <item>Apples</item>
    <item>Pears</item>
    <item>Bananas</item>
</string-array>    
<string-array name="list_pref1_values">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</string-array>

<string-array name="list_pref2_titles">
    <item>Cream</item>
    <item>Ice Cream</item>
    <item>Custard</item>
</string-array>

<string-array name="list_pref2_values">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</string-array>          

我的课程

  • com.my.test.MainPreferenceActivity:此主屏幕的代码 偏好
  • com.my.test.SubScreenPreferenceActivity:此子屏幕的代码 的偏好

屏幕的样子

当显示设置时,用户将看到

Section 1 Heading
-----------------
Pref 1

Section 2 Heading
-----------------
Sub screen of settings

点击“设置的子屏幕”将转到第二个设置屏幕,如下所示

Additional Settings
-------------------
List Pref 1
Apples

List Pref 2
Cream

点击“List Pref 1”会显示一个弹出窗口供用户选择苹果/梨/香蕉

点击“List Pref 2”会显示一个弹出窗口供用户选择Cream / Ice cream / Custard

在SubScreenPreferenceActivity中,我已经注册了OnSharedPreferenceChangeListener,这样当用户从弹出的其中一个选项中选择一个值时,ListPreferences的摘要将使用用户选择的值进行更新。

我完全坚持

我希望main_screen还包含在sub_screen中设置的值的摘要,例如,在主屏幕中,我希望它像下面那样呈现

Section 1 Heading
----------------
Pref 1

Section 2 Heading
------------------
Sub screen of settings
Apples, Cream

我希望当我最初进入main_screen时,“子屏幕设置”首选项的摘要已经设置为子屏幕中首选项的当前存储值(使用显示值而不是实际值)。

当用户进入子屏幕并更改值时,返回主屏幕时,“设置子屏幕”首选项的摘要会更新,以显示设置的新值。

如何将main_screen(MainPreferenceActivity)中的摘要设置为在sub_screen中选择的值?

当sub_screen(SubScreenPreferenceActivity)中的首选项发生变化时,如何更新main_screen?

为什么我将sub_screen xml放在自己的文件和活动中

顺便说一句,我将子屏幕放在一个单独的XML文件中,并且有自己的Activity类,因为我需要从Android设置屏幕调用它。

在Android设置中,当您点击我的应用程序的帐户时,它会显示“帐户和设置|同步设置”屏幕。在此屏幕中,我显示“第2节标题”PreferenceCategory部分(就像在我的应用程序设置屏幕中一样),单击“帐户和设置|同步设置”屏幕将转到我的应用程序中的子部分首选项屏幕。

Account & Settings | Sync Settings

AppIcon myAccount
        appName

Section 2 Heading
-----------------
Sub screen of settings
Apples, Cream

DATA & SYNCHRONIZATION
----------------------

account_authenticator.xml

<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
    android:accountType="myAccount"
    android:icon="@drawable/launcher"
    android:label="@string/app_name"
    android:smallIcon="@drawable/launcher" 
    android:accountPreferences="@xml/account_preferences"/> 

account_preferences.xml

<?xml version="1.0" encoding="UTF-8"?>

        <PreferenceCategory
           style="@style/settings_category_text"
           android:key="extra_settings_category"
           android:title="Section 2 Heading" />

        <PreferenceScreen
            android:key="sub_screen"
            android:title="Sub screen of settings"
            android:summary=""> 
            <intent
                android:targetPackage="com.my.test"
                android:targetClass="com.my.test.SubScreenPreferenceActivity" />
        </PreferenceScreen>


</PreferenceScreen>     

1 个答案:

答案 0 :(得分:1)

我自己解决了这个问题。结果证明并不太复杂。

在第一个首选项屏幕的活动的“onResume”中,我只是调用一个实用程序方法来生成首选项的摘要字符串,该摘要的摘要是包含第二个屏幕中所有选定值的值。此实用程序方法查询存储的首选项以获取首选项值,然后组成一个合适的字符串。由于此实用程序方法检查存储的首选项的值,因此当您第一次进入活动时以及从子屏幕返回活动时,摘要将是准确的。

例如

在“com.my.test.MainPreferenceActivity”“onResume”方法中我有以下内容

// update the preference's summary to a string containing the values selected in the sub-screen
Preference syncPref = findPreference(SUB_SCREN_OF_SETTINGS);
syncPref.setSummary(getSubScreenSummary(....));



public String getSubScreenSummary(){
    // get the value of list_pref_1
    // get the value of list_pref_2
    String s = ...... // build up the string based on values of list_pref_1/list_pref_2
    return s;
}