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
In this tutorial we are going to explore the Shared Preferences in many different ways
- Shared Prefernces using the Preference activity
- Manipulate the Preference summary to display the value
- Ability to put buttons on a preference screen for other actions
- Custom shared preferences not using Preference activity
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:
- Call edit() to get a SharedPreferences.Editor.
- Add values with methods such as putBoolean() and putString().
- 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());
 }
}






No comments:
Post a Comment
NO JUNK, Please try to keep this clean and related to the topic at hand.
Comments are for users to ask questions, collaborate or improve on existing.