Android Shared Preferences example using PreferenceFragment - Store, fetch and edit

Android provides several options for you to save persistent application data and one of them is Shared Preferences. The solution you choose depends on your specific needs, such as whether the data should be private to your application or accessible to other applications (and the user) and how much space your data requires.

Your data storage options are the following:
  • Shared Preferences
    • Store private primitive data in key-value pairs.
  • Internal Storage
  • External Storage
  • SQLite Databases
  • Network Connection
Please note: This tutorial has been updated to use PreferenceFragment, addPreferencesFromResource method has been deprecated in in API level 11.

In this tutorial we are going to explore the Shared Preferences in many different ways 
  1. Shared Prefernces using the Preference activity
  2. Manipulate the Preference summary to display the value 
  3. Ability to put buttons on a preference screen for other actions
  4. Custom shared preferences not using Preference activity
Android Shared Preferences eclipse Project
Android Shared Preferences example
Android Standard Preferences
Android Preferences within Preferences
Android Preferences with Values displayed in Summary
Android custom Preferences without extending PreferenceActivity

The SharedPreferences class provides a general framework that allows you to save and retrieve persistent key-value pairs of primitive data types. You can use SharedPreferences to save any primitive data: booleans, floats, ints, longs, and strings. This data will persist across user sessions (even if your application is killed).

Shared preferences are not strictly for saving "user preferences," such as what ringtone a user has chosen.

To get a SharedPreferences object for your application, use one of two methods:
  • getSharedPreferences() 
    • Use this if you need multiple preferences files identified by name, which you specify with the first parameter.
  • getPreferences()
    • Use this if you need only one preferences file for your Activity. Because this will be the only preferences file for your Activity, you don't supply a name.

To write values:
  1. Call edit() to get a SharedPreferences.Editor.
  2. Add values with methods such as putBoolean() and putString().
  3. Commit the new values with commit()

To read values, use SharedPreferences methods such as getBoolean() and getString().

Andorid application manifest file - AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.as400samplecode"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity 
            android:name=".Preferences" 
            android:label="@string/app_name"
   android:theme="@android:style/Theme.Holo.Light.Dialog.NoActionBar">
  </activity>
  <activity 
            android:name=".Preferences2" 
            android:label="@string/app_name"
   android:theme="@android:style/Theme.Holo.Light.Dialog.NoActionBar">
  </activity>
  <activity 
            android:name=".Preferences3" 
            android:label="@string/app_name"
   android:theme="@android:style/Theme.Holo.Light.Dialog.NoActionBar">
  </activity>
  <activity 
            android:name=".Preferences4" 
            android:label="@string/app_name"
   android:theme="@android:style/Theme.Holo.Light.Dialog.NoActionBar">
  </activity>
    </application>

</manifest>

Application strings resource - strings.xml

<resources>

    <string name="app_name">Android Shared Preferences</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">Android Preferences Tutorial and Sample Code</string>
    <string name="prefs_text1">Standard Preferences</string>
    <string name="prefs_text2">Preferences with value displayed as summary</string>
    <string name="prefs_text3">Custom Preferences without extending PreferenceActivity</string>

</resources>

Application array resource - arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="listArray">
   <item>Dog</item>
   <item>Cat</item>
   <item>Other</item>
</string-array>
 
<string-array name="listValues">
   <item>1</item>
   <item>2</item>
   <item>3</item>
</string-array>
</resources>

Application main layout - activity_main.xml

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
 android:layout_height="match_parent">

 <TextView android:id="@+id/textView1" android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:layout_alignParentLeft="true"
  android:layout_alignParentTop="true" android:layout_marginLeft="10dp"
  android:layout_marginTop="10dp" android:text="@string/title_activity_main"
  android:textAppearance="?android:attr/textAppearanceMedium" />

 <Button android:id="@+id/preferences1" style="?android:attr/buttonStyleSmall"
  android:layout_width="fill_parent" android:layout_height="wrap_content"
  android:layout_alignParentLeft="true" android:layout_below="@+id/textView1"
  android:text="@string/prefs_text1" />

 <Button android:id="@+id/preferences2" style="?android:attr/buttonStyleSmall"
  android:layout_width="fill_parent" android:layout_height="wrap_content"
  android:layout_alignParentLeft="true" android:layout_below="@+id/preferences1"
  android:text="@string/prefs_text2" />

 <Button android:id="@+id/preferences3" style="?android:attr/buttonStyleSmall"
  android:layout_width="fill_parent" android:layout_height="wrap_content"
  android:layout_alignParentLeft="true" android:layout_below="@+id/preferences2"
  android:text="@string/prefs_text3" />

</RelativeLayout>

Application main Activity - MainActivity.java

package com.as400samplecode;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  Button preferencesButton1 = (Button) findViewById(R.id.preferences1);
  preferencesButton1.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
    Intent settingsActivity = new Intent(getBaseContext(),
      Preferences.class);
    startActivity(settingsActivity);
   }
  });

  Button preferencesButton2 = (Button) findViewById(R.id.preferences2);
  preferencesButton2.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
    Intent settingsActivity = new Intent(getBaseContext(),
      Preferences3.class);
    startActivity(settingsActivity);
   }
  });

  Button preferencesButton3 = (Button) findViewById(R.id.preferences3);
  preferencesButton3.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
    Intent settingsActivity = new Intent(getBaseContext(),
      Preferences4.class);
    startActivity(settingsActivity);
   }
  });


 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }
}

Standard Preferences XML layout - preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 <PreferenceCategory android:title="My list of Preferences">
  <CheckBoxPreference android:title="Checkbox Preference"
   android:defaultValue="false" android:summary="This preference can be true or false"
   android:key="checkboxPref" />
  <ListPreference android:title="Your favorite Pet"
   android:summary="This preference allows to select an item in a array"
   android:key="listPref" android:defaultValue="digiGreen"
   android:entries="@array/listArray" android:entryValues="@array/listValues" />
  <EditTextPreference android:name="EditText Preference"
   android:summary="This allows you to enter a string"
   android:defaultValue="Nothing" android:title="Edit This Text"
   android:key="editTextPref" />
  <RingtonePreference android:name="Ringtone Preference"
   android:summary="Select a ringtone" android:title="Ringtones"
   android:key="ringtonePref" />
  <PreferenceScreen android:key="SecondPrefScreen"
   android:title="Secondary Level" android:summary="This is a sub PreferenceScreen">
   <intent android:action="android.intent.action.VIEW"
    android:targetPackage="com.as400samplecode" android:targetClass="com.as400samplecode.Preferences2" />
  </PreferenceScreen>
  <Preference android:title="Custom Preference"
   android:summary="This works almost like a button" android:key="customPref" />
 </PreferenceCategory>
</PreferenceScreen>

Standard Preferences Activity - Preferences.java

package com.as400samplecode;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.widget.Toast;

public class Preferences extends PreferenceActivity {

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  getFragmentManager().beginTransaction().replace(android.R.id.content,
    new PrefsFragment()).commit();
  PreferenceManager.setDefaultValues(Preferences.this, R.xml.preferences, false);
  
 }
 
 public class PrefsFragment extends PreferenceFragment {
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
   
   super.onCreate(savedInstanceState);
   addPreferencesFromResource(R.xml.preferences);
   
   // Get the custom preference
   Preference customPref = (Preference) findPreference("customPref");
   customPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {

    public boolean onPreferenceClick(Preference preference) {
     Toast.makeText(getBaseContext(), "The custom preference has been clicked",
       Toast.LENGTH_LONG).show();
     SharedPreferences customSharedPreference = getSharedPreferences(
       "myCustomSharedPrefs", Activity.MODE_PRIVATE);
     SharedPreferences.Editor editor = customSharedPreference.edit();
     editor.putString("myCustomPref", "The preference has been clicked");
     editor.commit();
     return true;
    }

   });
   
  }
  
 }
}

Standard sub Preferences XML layout - preferences2.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 <PreferenceCategory android:title="My secondary list of Preferences">
  <CheckBoxPreference android:title="Checkbox Preference"
   android:defaultValue="false" android:summary="This preference can be true or false"
   android:key="checkboxPref2" />
  <EditTextPreference android:name="EditText Preference"
   android:summary="This allows you to enter a string"
   android:defaultValue="Nothing" android:title="Edit This Text"
   android:key="editTextPref2" />
 </PreferenceCategory>
</PreferenceScreen>

Standard sub Preferences Activity - Preferences2.java

package com.as400samplecode;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;

public class Preferences2 extends PreferenceActivity {

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content,
    new PrefsFragment()).commit();
  PreferenceManager.setDefaultValues(Preferences2.this, R.xml.preferences, false);
  
    }
 
 public static class PrefsFragment extends PreferenceFragment {
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
   
   super.onCreate(savedInstanceState);
   addPreferencesFromResource(R.xml.preferences2);
  }
 }
 
}

Preferences with summary Text XML layout - preferences3.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 <PreferenceCategory android:title="Preferences with value displayed as summary">
  <EditTextPreference android:summary="Enter URL for Web Web Connetivity"
   android:defaultValue="" android:title="URL for connectivity"
   android:key="editURLPref" />
  <EditTextPreference android:summary="Enter Secret Word for secure Transactions"
   android:defaultValue="" android:title="Secret Word" android:key="editKey"
   android:password="true" />
 </PreferenceCategory>
</PreferenceScreen>

Preference window with close button XML layout - pref_window.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 android:orientation="vertical">
 <FrameLayout android:id="@+id/displayPrefs"
  android:layout_width="wrap_content" android:layout_height="wrap_content">
  <ListView android:id="@android:id/list" android:layout_width="fill_parent"
  android:layout_height="fill_parent" android:layout_weight="1" />
 </FrameLayout> 
 <LinearLayout android:layout_height="wrap_content"
  android:layout_width="match_parent" android:id="@+id/linearLayout1"
  android:layout_gravity="right" android:orientation="horizontal">
  <TextView android:layout_width="wrap_content"
   android:layout_height="wrap_content" android:text=" " android:id="@+id/textView1"
   android:layout_weight="1" />
  <Button android:layout_width="wrap_content" android:id="@+id/close"
   android:layout_height="wrap_content" android:text="Close" />
 </LinearLayout>
</LinearLayout>

Preferences with buttons and summary Text Activity - Preferences3.java

package com.as400samplecode;

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Preferences3 extends PreferenceActivity{

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.prefs_window);
  
  getFragmentManager().beginTransaction().replace(R.id.displayPrefs,
    new PrefsFragment()).commit();
  PreferenceManager.setDefaultValues(Preferences3.this, R.xml.preferences3, false);
  
  Button mClose = (Button)findViewById(R.id.close);
  mClose.setOnClickListener(new OnClickListener() 
  {         
   public void onClick(View v) 
   {
    finish();
   }
  });
  
 }

 public static class PrefsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener{

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

   addPreferencesFromResource(R.xml.preferences3);
   
   for(int i=0;i<getPreferenceScreen().getPreferenceCount();i++){
    initSummary(getPreferenceScreen().getPreference(i));
   }

  }
  
  @Override
  public void onResume(){
   super.onResume();
   // Set up a listener whenever a key changes             
   getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
  }

  @Override
  public void onPause() { 
   super.onPause();
   // Unregister the listener whenever a key changes             
   getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);     
  } 

  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
   updatePrefSummary(findPreference(key));
  }

  private void initSummary(Preference p){
   if (p instanceof PreferenceCategory){
    PreferenceCategory pCat = (PreferenceCategory)p;
    for(int i=0;i<pCat.getPreferenceCount();i++){
     initSummary(pCat.getPreference(i));
    }
   }else{
    updatePrefSummary(p);
   }

  }

  private void updatePrefSummary(Preference p){
   if (p instanceof ListPreference) {
    ListPreference listPref = (ListPreference) p; 
    p.setSummary(listPref.getEntry()); 
   }
   if (p instanceof EditTextPreference) {
    EditTextPreference editTextPref = (EditTextPreference) p; 
    if(p.getKey().equalsIgnoreCase("editKey")){
     p.setSummary("I am not going to display a password!"); 
    }
    else {
     p.setSummary(editTextPref.getText()); 
    }
   }

  }

 }

}

Custom Preferences without PreferenceActivity XML layout - custom_pref.xml

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
 android:layout_height="match_parent">

 <TextView android:id="@+id/textView1" android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:layout_alignParentLeft="true"
  android:layout_alignParentTop="true" android:layout_marginTop="10dp"
  android:text="Custom Preferences without extending PreferenceActivity"
  android:textAppearance="?android:attr/textAppearanceMedium" />

 <TextView android:id="@+id/textView2" android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:layout_alignParentLeft="true"
  android:layout_below="@+id/textView1" android:layout_marginTop="20dp"
  android:text="EditText Preference" android:textAppearance="?android:attr/textAppearanceMedium" />

 <EditText android:id="@+id/editText1" android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:layout_alignParentLeft="true"
  android:layout_below="@+id/textView2" android:ems="10">

  <requestFocus />
 </EditText>

 <TextView android:id="@+id/textView3" android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:layout_alignParentLeft="true"
  android:layout_below="@+id/editText1" android:text="Checkbox Preference"
  android:textAppearance="?android:attr/textAppearanceMedium" />

 <CheckBox android:id="@+id/checkBox1" android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:layout_alignParentLeft="true"
  android:layout_below="@+id/textView3" android:text="CheckBox" />

 <TextView android:id="@+id/textView4" android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:layout_alignParentLeft="true"
  android:layout_below="@+id/checkBox1" android:text="Radio Button Preference"
  android:textAppearance="?android:attr/textAppearanceMedium" />

 <RadioGroup android:id="@+id/radioGroup1"
  android:layout_width="wrap_content" android:layout_height="wrap_content"
  android:layout_alignParentLeft="true" android:layout_below="@+id/textView4">

  <RadioButton android:id="@+id/radio0"
   android:layout_width="wrap_content" android:layout_height="wrap_content"
   android:checked="true" android:text="RadioButton" />

  <RadioButton android:id="@+id/radio1"
   android:layout_width="wrap_content" android:layout_height="wrap_content"
   android:text="RadioButton" />

  <RadioButton android:id="@+id/radio2"
   android:layout_width="wrap_content" android:layout_height="wrap_content"
   android:text="RadioButton" />
 </RadioGroup>

 <Button android:id="@+id/save" style="?android:attr/buttonStyleSmall"
  android:layout_width="wrap_content" android:layout_height="wrap_content"
  android:layout_alignParentLeft="true" android:layout_below="@+id/radioGroup1"
  android:text="Save" />

 <Button android:id="@+id/close" style="?android:attr/buttonStyleSmall"
  android:layout_width="wrap_content" android:layout_height="wrap_content"
  android:layout_alignBaseline="@+id/save" android:layout_alignBottom="@+id/save"
  android:layout_toRightOf="@+id/save" android:text="Cancel" />

</RelativeLayout>

Custom Preferences without PreferenceActivity - Preferences4.java

package com.as400samplecode;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;


public class Preferences4 extends Activity {

 private EditText prefEditText;
 private CheckBox prefCheckbox;
 private RadioGroup prefRadioGroup;
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.custom_pref);

  SharedPreferences customSharedPreference = getSharedPreferences("myCustomSharedPrefs", Activity.MODE_PRIVATE);
  
  prefEditText = (EditText) findViewById(R.id.editText1);
  prefEditText.setText(customSharedPreference.getString("myEditTextPref", ""));
  
  prefCheckbox = (CheckBox) findViewById(R.id.checkBox1);
  prefCheckbox.setChecked(customSharedPreference.getBoolean("myCheckBoxPref", false));
  
  prefRadioGroup = (RadioGroup) findViewById(R.id.radioGroup1);
  RadioButton radioButton0 = (RadioButton) findViewById(R.id.radio0);
  prefRadioGroup.check(customSharedPreference.getInt("myRadioGroupPref",radioButton0.getId()));
  
  Button mClose = (Button)findViewById(R.id.close);
  mClose.setOnClickListener(new OnClickListener() 
  {         
   public void onClick(View v) 
   {
    finish();
   }
  });

  Button mSave = (Button)findViewById(R.id.save);
  mSave.setOnClickListener(new OnClickListener() 
  {         
   public void onClick(View v) 
   {
    savePreferences();
    finish();
   }
  });

 }

 private void savePreferences(){

  SharedPreferences customSharedPreference = getSharedPreferences("myCustomSharedPrefs", Activity.MODE_PRIVATE);
  SharedPreferences.Editor editor = customSharedPreference.edit();
  editor.putString("myEditTextPref", prefEditText.getText().toString());
  editor.putBoolean("myCheckBoxPref",prefCheckbox.isChecked());
  editor.putInt("myRadioGroupPref", prefRadioGroup.getCheckedRadioButtonId());
  editor.commit();

  RadioButton radioButton = (RadioButton) findViewById(prefRadioGroup.getCheckedRadioButtonId());
  Log.v("Preferences:", "Radio Text: " + radioButton.getText());
 }
}

5 comments :

  1. Thats what I need!
    Thanks!

    ReplyDelete
  2. Grate work...!!!
    Thanks a lot.Keep it up.;)

    ReplyDelete
  3. Really Nice..!! This is what I was looking for 2 days and finally done. Thanks a lot

    ReplyDelete
  4. Awesome!
    Thanks for putting this together. Fantastic job!

    ReplyDelete