Search code examples
androidpreferencessharedpreferencespreferenceactivity

Can't get preference set with PreferenceActivity


I have this main activity:

public class Home extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
        initializeStyle();
    }
    private void initializeStyle() {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        String foobar = prefs.getString("foobar", "hi");
        Log.i("MyActivity", foobar);
    }
// ...
}

And this PreferenceActivity:

public class Preferences extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }
}

With this XML:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory 
        android:key="preferences_font"
        android:title="@string/preferences_font">
    <EditTextPreference
            android:title="@string/preferences_font_size"
            android:key="foobar"
            android:defaultValue="12">
    </EditTextPreference>
</PreferenceCategory>
</PreferenceScreen>

Log.i prints "hi", so it means this preference doesn't exist or I named it badly.

Any idea about what I've done wrong?

Regards,


Solution

  • This might help you get back on track and having working preferences:

    XML FILE: preferences.xml

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
        <PreferenceCategory android:title="Preferences Font">
            <EditTextPreference 
                android:title="Select Font Size" 
                android:key="foobar" 
                android:summary="Enter Font Size"
                android:defaultValue="12" />
        </PreferenceCategory>
    </PreferenceScreen> 
    

    JAVA FILE 1: Home.java

    public class Home extends Activity {
    
        public SharedPreferences prefs;
    
        static public String fontPref; //you can make it an int or whatever you need
        static public String myValue; //to store new pref value
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
    
             setContentView(R.layout.home);
             initializeStyle();
        } 
    
        private void initializeStyle() {
           prefs = PreferenceManager.getDefaultSharedPreferences(this);
           fontPref = prefs.getString("foobar", "hi"); //this doesn't actually change the value
           myValue = "This is a test";
           Log.i("MyActivity", foobar); //won't show change yet
        }
    }
    

    JAVA FILE 2: Prefernce.java

    import android.preference.Preference;
    import android.preference.PreferenceActivity;
    import android.preference.PreferenceManager;
    //... and any other imports
    
    public class Preferences extends PreferenceActivity  implements OnSharedPreferenceChangeListener{
    
        private SharedPreferences prefs;
    
        @Override
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
            //add other stuff here if you need, especially if you might have some
            //prefs that use buttons and need to set up your onClickListener for one
        }
    
        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPref, String key) {
            Editor editor = sharedPref.edit();
            if(key.equalsIgnoreCase("foobar")){
                Home.fontPref = sharedPref.getString("foobar", "some value");
                editor.putString("foobar", Home.myValue); //where ever or whatever new value is 
            }
    
            editor.commit();
            Log.i("PrefsActivity", foobar); //should show change now
        }
    } 
    

    Hopefully this may help you get on the right track. Of course there are many ways to do these things so, good luck hope it helps.