4

我的要求

  • 有一个充满偏好的主屏幕(main_screen)
  • 单击此 main_screen 中的一个首选项(pref1)会打开设置的子屏幕(sub_screen)
  • 在这个 sub_screen 中,有 2 个 ListPreferences,当用户从这些列表中选择一个值时,该 ListPreference 的摘要会更新为包含用户选择的值
  • 在 main_screen 中,pref1 的摘要应该显示在子屏幕的 listPreferences 中选择的值(即摘要有 List1SelectedValue、List2SelectedValue)
  • 第一次进入 main_screen 时,应该填充 pref1 的摘要
  • 在进入 sub_screen 并更改值,然后返回到 main_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>

示例子屏幕 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”将显示一个弹出窗口供用户选择 Apples/Pears/Bananas

单击“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>     
4

1 回答 1

2

我自己解决了这个问题。事实证明它并不太复杂。

在第一个首选项屏幕的活动的“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;
}
于 2016-10-18T10:19:30.723 回答