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

StackOverflow https://stackoverflow.com/questions/18123823

  •  23-06-2022
  •  | 
  •  

Domanda

My requirement

  • Have a main screen full of preferences (main_screen)
  • One preference (pref1) in this main_screen when clicked upon opens a sub screen of settings (sub_screen)
  • In this sub_screen, there are 2 ListPreferences, when the user selects a value from these lists, the summary for that ListPreference is updated to contain the value the user selected
  • in the main_screen, the summary for pref1 should show the values selected in the subscreen's listPreferences (i.e. the summary has List1SelectedValue, List2SelectedValue)
  • On going into the main_screen for the first time, the summary for pref1 should be populated
  • On going to the sub_screen and changing the values, and then returning to the main_screen the summary should be updated to reflect the newly selected values in sub_screen.

I have searched around and i can not work out how to set the summary of the pref1 on the main screen to the values selected in the sub_screen.

Sample 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>

Sample 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>

Sample arrays for list values in 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>          

My classes

  • com.my.test.MainPreferenceActivity : code for this main screen of preferences
  • com.my.test.SubScreenPreferenceActivity : code for this sub screen of preferences

What the screens look like

When the settings are displayed the user will see

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

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

Clicking on "Sub screen of settings" will take you to a second settings screen that looks like the following

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

List Pref 2
Cream

Clicking on "List Pref 1" will show a popup for the user to select Apples/Pears/Bananas

Clicking on "List Pref 2" will show a popup for the user to select Cream/Ice cream/Custard

In SubScreenPreferenceActivity i have registered an OnSharedPreferenceChangeListener so that when the user selects a value from one of the options popped up the summary for the the ListPreferences is updated with the value the user has selected.

What I am completely stuck on

I would like the main_screen to also contain a summary of the values that have been set in the sub_screen, for example, in the main screen i would like it to render like the following

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

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

I would like it that when i go into the main_screen initially, the "Sub screen of settings" preference's summary is already set to the currently stored values for the preferences in the sub-screen (using the display values not the actual values).

Also when the user goes to the sub screen and changes the values, on returning to the main_screen the "Sub screen of settings" preference's summary is updated to show the new values of the settings.

How do i set the summary in the main_screen (MainPreferenceActivity) to the values selected in the sub_screen?

How do i update the main_screen when the preferences in the sub_screen (SubScreenPreferenceActivity) change?

Why I have the sub_screen xml in its own file and activity

By the way, I have the sub-screen in a separate XML file and with its own Activity class as I need to call it from the Android settings screens.

In the Android settings, when you click on the Account for my application it shows the "Account & Settings | Sync Settings" screen. In this screen i have it displaying the "Section 2 Heading" PreferenceCategory section (just like in my applications settings screen), clicking on "Account & Settings | Sync Settings" screen takes you to the sub-section preferences screen in my application.

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>     
È stato utile?

Soluzione

I have resolved this myself. It turned out to not be too complex.

In the "onResume" of the activity for the first preference screen, I simply call a utility method to generate the summary string for the preference whose summary is to contain the values of all selected values in the second screen. This utility method queries the stored preferences to get the preference values and then makes up a suitable string. As this utility method checks the values of the stored preference the summary will be accurate when you first go into the activity as well as when you return to the activity from the sub-screen.

For example

in "com.my.test.MainPreferenceActivity" "onResume" method i have the following

// 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top