Search code examples
androidsharedpreferencespreferenceactivity

addPreferencesFromResource makes sharedPreferences not work


So probably another newbish question :)

I have an Activity, an AppWidgetProvider and a PreferenceActivity. In the PreferenceActivity I have a ListPreference which I use to define the text-size for the widget. The sharedPreferences are loaded with no problems when the main activity starts, but as soon as the PreferenceActivity is run, I can no longer retrieve the sharedPreference values properly in the main activity. I tried retrieving the sharedPreference values directly in the PreferenceActivity and the same thing happened: For some reason when I try to get the values from the sharedPreferences BEFORE I call addPreferencesFromResource(R.drawable.settings); (at comment 'Test 1'), it says:

"onStart() 1, size: small" and "Small works!"

I.e. it works. But when I try to retrieve the values AFTER the resource-call (at comment 'Test 2'), it says:

"onStart() 2, size: small" and "It doesn't work ..."

I.e. it DOESN'T work. I have NO idea why. Obviously it gets the value of the sharedPreference as it says that the current textWidgetSize equals "small" in both cases, but for some reason it doesn't think that "small" = "small" after the resource-call. Do you guys have any idea what's wrong?

Here's the PreferenceActivity code:

package dk.mfoller.android.basicnote;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.widget.Toast;
import dk.mfoller.android.basicnote.R;

public class BasicNoteSettings extends PreferenceActivity{

    String widgetTextSize = "small";
    boolean widgetLineCounter = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Calls a function to get the preferences
        getPrefs();

        // Test 1
        makeToast("onStart() 1, size: " + widgetTextSize);
        if(widgetTextSize == "small") {
            makeToast("Small works!");
        } else if(widgetTextSize == "medium") {
            makeToast("Medium works!");
        } else if(widgetTextSize == "large") {
            makeToast("Large works!");
        } else {
            makeToast("It doesn't work ...");
        }

        // Gets the preference layout from xml
        addPreferencesFromResource(R.drawable.settings);

        // Calls a function to get the preferences
        getPrefs();

        // Test 2
        makeToast("onStart() 2, size: " + widgetTextSize);
        if(widgetTextSize == "small") {
            makeToast("Small works!");
        } else if(widgetTextSize == "medium") {
            makeToast("Medium works!");
        } else if(widgetTextSize == "large") {
            makeToast("Large works!");
        } else {
            makeToast("It doesn't work ...");
        }

    }

    // A function to get the preferences    
    private void getPrefs() {
        // Gets data from the shared preferences
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        widgetTextSize = prefs.getString("text_size_list", "small");
        widgetLineCounter = prefs.getBoolean("line_counter_cbox", true);
    }

    // A function to display a popup
    private void makeToast(String popup) {
        Toast.makeText(this, popup, Toast.LENGTH_SHORT).show();
    }

}

Here's the xml-document:

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

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="basicnote_settings"
    android:title="@string/settings_label">

    <PreferenceCategory android:title="Text size">
        <ListPreference android:key="text_size_list"
        android:title="Widget text size"
        android:summary="@string/text_size_summary"
        android:entries="@array/text_size_options"
        android:entryValues="@array/text_size_values"
        android:defaultValue="small" />
    </PreferenceCategory>

    <PreferenceCategory android:title="Other settings">
        <CheckBoxPreference android:key="line_counter_cbox"
            android:title="Line counter"
            android:summary="@string/hidden_lines_summary"
            android:defaultValue="true" />
    </PreferenceCategory>

</PreferenceScreen>

And here are my resource strings:

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

<!-- Defines various resources -->
<resources>
    <string name="app_name">basicNote</string>
    <string name="note_hint">Tap to add some notes ...</string>
    <string name="fake_load">Loading notes ...</string>

    <string name="settings_label">basicNote settings</string>

    <string name="text_size_summary">Set the size of the widget text</string>
    <string-array name="text_size_options">
        <item>Small (12sp)</item>
        <item>Medium (13sp)</item>
        <item>Large (15sp)</item>
    </string-array>
    <string-array name="text_size_values">
        <item>small</item>
        <item>medium</item>
        <item>large</item>
    </string-array>

    <string name="hidden_lines_summary">Show/hide the number of lines not shown in the widget</string>
</resources>

Solution

  • Your using == on a String object. Use .equals(yourString) instead.