安卓 : Set a preference's summary in a main preference screen to the values selected in a sub preference screen

标签 android preferences summary

我的需求

  • 拥有一个充满偏好的主屏幕 (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 应更新摘要以反射(reflect)
    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?

    为什么我在自己的文件和 Activity 中有 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>     
    

    最佳答案

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

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

    例如

    在“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;
    }
    

    关于安卓 : Set a preference's summary in a main preference screen to the values selected in a sub preference screen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18123823/

    相关文章:

    java - 从 Assets 中打开 pdf

    java - 从android方法中获取参数

    java - Android 首选项屏幕,仅全屏?

    java - 以下代码没有设置小部件在另一个 Activity 中可见的功能

    javascript - 如何在 jump-break blogger/blogspot 之前显示摘要帖子

    python - 如何从 csv 文件获取存储聚合值的字典字典

    android - 打开抽屉导航时从工具栏中移除阴影 - Material Design 支持库

    android - 当我在 Facebook 上发布消息时如何解决 OAuthException

    android - 以编程方式在 Android 中启用/禁用屏幕旋转

    r - R 中系数的不同 NA 操作和线性模型总结