android sharedpreference保存boolean,int,float,long,String和图片的使用方法及实例(附快速使用类文件)
hello,大家好,今天上传一下本人对于android 中sharedpreference的理解,以及自己使用的一个Demo的讲解。
SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。
SharedPreferences相对于sqllite使用起来相当方便,但是SharedPreferences也只能存储boolean,int,float,long和String五种简单的数据类型,本文在上述五种类型的基础上增加了图片的保存,并将其封装成了一个可以快速使用的java类,下面进行代码的展示跟演示:
PreferencesUtils.java文件:
其中将SharedPreferences的五种类型以及图片的读取和存储都写好了,使用时可直接引入到项目中进行快速开发。
package com.example.sharedpreferencedtestdemo;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import android.content.Context;import android.content.SharedPreferences;import android.graphics.Bitmap.CompressFormat;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.util.Base64;public class PreferencesUtils { public static String PREFERENCE_NAME = "TrineaAndroidCommon"; /** * put string preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static boolean putString(Context context, String key, String value) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putString(key, value); return editor.commit(); } /** * get string preferences * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or null. Throws ClassCastException if there is a preference with this * name that is not a string * @see #getString(Context, String, String) */ public static String getString(Context context, String key) { return getString(context, key, null); } /** * get string preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with * this name that is not a string */ public static String getString(Context context, String key, String defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getString(key, defaultValue); } /** * put int preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static boolean putInt(Context context, String key, int value) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putInt(key, value); return editor.commit(); } /** * get int preferences * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this * name that is not a int * @see #getInt(Context, String, int) */ public static int getInt(Context context, String key) { return getInt(context, key, -1); } /** * get int preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with * this name that is not a int */ public static int getInt(Context context, String key, int defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getInt(key, defaultValue); } /** * put long preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static boolean putLong(Context context, String key, long value) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putLong(key, value); return editor.commit(); } /** * get long preferences * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this * name that is not a long * @see #getLong(Context, String, long) */ public static long getLong(Context context, String key) { return getLong(context, key, -1); } /** * get long preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with * this name that is not a long */ public static long getLong(Context context, String key, long defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getLong(key, defaultValue); } /** * put float preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static boolean putFloat(Context context, String key, float value) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putFloat(key, value); return editor.commit(); } /** * get float preferences * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this * name that is not a float * @see #getFloat(Context, String, float) */ public static float getFloat(Context context, String key) { return getFloat(context, key, -1); } /** * get float preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with * this name that is not a float */ public static float getFloat(Context context, String key, float defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getFloat(key, defaultValue); } /** * put boolean preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static boolean putBoolean(Context context, String key, boolean value) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean(key, value); return editor.commit(); } /** * get boolean preferences, default is false * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this * name that is not a boolean * @see #getBoolean(Context, String, boolean) */ public static boolean getBoolean(Context context, String key) { return getBoolean(context, key, false); } /** * get boolean preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with * this name that is not a boolean */ public static boolean getBoolean(Context context, String key, boolean defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getBoolean(key, defaultValue); } /** * get picture preferences * * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this * name that is not a picture */ public static Drawable getPicture(Context context,String key){ return getPicture(context, key,""); } /** * get picture preferences * * @param context * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this * name that is not a picture */ public static Drawable getPicture(Context context,String key,String defaultValue){ SharedPreferences settings=context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); String srcName=settings.getString(key, defaultValue); byte[] base64Bytes = Base64.decode(srcName, 1);ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);return Drawable.createFromStream(bais, srcName); } /** * put picture preferences * * @param context * @param key The name of the preference to modify * @param value The new value for the preference * @return True if the new values were successfully written to persistent storage. */ public static Boolean putPicture(Context context,String key,Drawable value){ SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ((BitmapDrawable) value).getBitmap().compress(CompressFormat.JPEG, 100, baos); String srcName = new String(Base64.encodeToString(baos.toByteArray(), 1)); editor.putString(key, srcName); return editor.commit(); }}
下面是Demo的XML文件:
<LinearLayout 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" android:orientation="vertical" > <EditText android:id="@+id/edt_string" android:layout_width="match_parent" android:layout_height="50dp" android:hint="请输入要保存的内容" /> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal" > <TextView android:id="@+id/txt_boolen" android:layout_width="0dp" android:layout_height="50dp" android:layout_marginTop="10dp" android:layout_weight="1" android:text="现在是True" /> <Button android:id="@+id/changeBool" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:onClick="changeBool" android:text="chanageBool" android:textSize="12sp" /> </LinearLayout> <ImageView android:id="@+id/customer_img_shop" android:layout_width="100dp" android:layout_height="100dp" android:clickable="true" android:onClick="changepicture" android:src="@drawable/nopicture" /> <Button android:id="@+id/save" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="save" android:text="采用SharedPreference保存上述类容" /> <Button android:id="@+id/read" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="read" android:text="采用SharedPreference读出上述类容"/></LinearLayout>
以及Demo的MainActivity文件,其中由于要保存图片,于是加了一个拍照和读取本地文件的功能,有需要的朋友也可以看看,没需要的朋友就可以直接略过了。
MainActivity.java:
package com.example.sharedpreferencedtestdemo;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import android.app.Activity;import android.app.AlertDialog;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.view.View;import android.view.View.OnClickListener;import android.widget.EditText;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private Boolean nowBoolean=true;private EditText edt_string;private TextView txt_boolen;private TextView take_picture_tv;private TextView gallery_tv;private String ImageName;private static final int REQUESTCODE_TAKEPICTURE = 1;private static final int REQUESTCODE_PICTUREROOM = 2;private static final int REQUESTCODE_TAKEPICTURE_CUT = 3;private String imagepath = "image/*";private Bitmap tmpBitmap;private ImageView customer_img_shop;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);txt_boolen=(TextView) findViewById(R.id.txt_boolen);edt_string=(EditText) findViewById(R.id.edt_string);customer_img_shop=(ImageView) findViewById(R.id.customer_img_shop);}//将当前Bool值置反public void changeBool(View view){if (nowBoolean==true){nowBoolean=false;txt_boolen.setText("现在是false");}else if (nowBoolean==false) {nowBoolean=true;txt_boolen.setText("现在是true");}else {Toast.makeText(this, "Rrror!", Toast.LENGTH_SHORT).show();return;}}//点击图片的地方选择图片public void changepicture(View view){takepicture();}//点击保存SharedPreference数据public void save(View view){PreferencesUtils.putBoolean(this, "Boolen", nowBoolean);PreferencesUtils.putString(this, "String", edt_string.getText().toString());PreferencesUtils.putPicture(this, "picture", customer_img_shop.getDrawable());}//点击读取已保存的SharedPreference数据public void read(View view){nowBoolean=PreferencesUtils.getBoolean(this, "Boolen", true);if (nowBoolean==true){txt_boolen.setText("现在是true");}else if (nowBoolean==false) {txt_boolen.setText("现在是false");}else {Toast.makeText(this, "Rrror!", Toast.LENGTH_SHORT).show();return;}edt_string.setText(PreferencesUtils.getString(this, "String", ""));customer_img_shop.setImageDrawable(PreferencesUtils.getPicture(this, "picture"));}// 选择本地照片/拍摄新的照片private void takepicture() {final AlertDialog imgdialog = new AlertDialog.Builder(this).show();imgdialog.setContentView(R.layout.settings_photo);take_picture_tv = (TextView) imgdialog.findViewById(R.id.take_picture_tv);gallery_tv = (TextView) imgdialog.findViewById(R.id.gallery_tv);// 调用相机take_picture_tv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {try {ImageName = "/picture.jpg";Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), ImageName)));if (CommonTools.isIntentAvailable(MainActivity.this, intent)) {startActivityForResult(intent, REQUESTCODE_TAKEPICTURE);} else {Toast.makeText(MainActivity.this,R.string.persional_information_camera_notexist,Toast.LENGTH_SHORT).show();}} catch (Exception e) {e.printStackTrace();}imgdialog.dismiss();}});// 从相册选择gallery_tv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_PICK, null);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imagepath);startActivityForResult(intent, REQUESTCODE_PICTUREROOM);imgdialog.dismiss();}});}// 处理图片--------------------------------------------------------------------------------@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode != Activity.RESULT_OK) {return;}// 拍照if (requestCode == REQUESTCODE_TAKEPICTURE) {// 设置文件保存路径这里放在根目录下File picture = new File(Environment.getExternalStorageDirectory()+ ImageName);startPhotoZoom(Uri.fromFile(picture));}if (data == null) {return;}// 相册if (requestCode == REQUESTCODE_PICTUREROOM) {startPhotoZoom(data.getData());}if (requestCode == REQUESTCODE_TAKEPICTURE_CUT) {Bundle extras = data.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable("data");tmpBitmap = photo;customer_img_shop.setImageBitmap(tmpBitmap);FileOutputStream stream = null;try {stream = new FileOutputStream(this.getApplicationContext().getFilesDir().getAbsolutePath()+ "/shop.jpg");} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (photo != null && stream != null) {photo.compress(Bitmap.CompressFormat.JPEG, 100, stream);// face.setImageBitmap(photo);}}super.onActivityResult(requestCode, resultCode, data);}}// 处理图片的大小public void startPhotoZoom(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, imagepath);intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", MyTools.dip2px(this, 150));intent.putExtra("outputY", MyTools.dip2px(this, 150));intent.putExtra("return-data", true);intent.putExtra("scale", true);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", false);startActivityForResult(intent, REQUESTCODE_TAKEPICTURE_CUT);}}
希望能够帮到大家,谢谢观看!
更多相关文章
- Android(安卓)常用设计模式
- React Native中gif格式图片无法在Android中显示问题
- Android—(获取并解析xml和Json)
- Android(安卓)XML解析学习——Sax方式
- android:打开系统联系人界面并获取数据
- Android之-----Frame帧动画(Animation)
- Android(安卓)Socket 开发
- android 图片Bitmap的旋转
- android之cursor