ذخیره اطلاعات و تنظیمات برنامه، با SharedPreferences در برنامه نویسی اندروید
در برنامه نویسی اندروید، SharedPreferences برای ذخیره اطلاعات و تنظیمات برنامه، می تواند به کار رود، به گونه ای که اگر کاربر اطلاعاتی را وارد کرد یا گزینه هایی را انتخاب نمود، با خارج شدن وی از برنامه (بستن برنامه یا خاموش کردن گوشی)، آن اطلاعات و انتخاب ها، از دست نرود.
در ادامه، یک برنامه اندروید می سازیم که در آن، کاربر، ((نام)) و ((سن)) خود را در برنامه وارد می کند و چنانچه برنامه را ببندد و دوباره وارد برنامه شود، گزینه های وارد شده توسط وی، همچنان در کادر ورود اطلاعات، نمایش داده می شود (اگر بخواهد می تواند آنها را تغییر دهد، ولی به هر حال، مجبور نیست دوباره آنها را وارد نماید).
در برنامه eclipse ، ابتدا یک پروژه اندروید با نام Kelidestan.com_SharedPreferences می سازیم (نام package را برابر com.kelidestan.sharedpreferences انتخاب می کنیم. نام activity اصلی را برابر MainActivity انتخاب می کنیم و فایل xml متناظر آن را هم برابر activity_main قرار می دهیم).
در زیرمجموعه فولدر res ، یک فولدر با نام xml می سازیم و سپس درون آن، یک فایل xml ، با نام prefs.xml می سازیم :
کدهای فایل prefs.xml را به صورت زیر می نویسیم :
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference android:key="name" android:title="@string/name" android:summary="@string/name_summary"/>
<EditTextPreference android:title="@string/age" android:key="age" android:summary="@string/age_summary"/>
</PreferenceScreen>
که در آن، دو EditTextPreference تعریف کرده ایم. بنابراین، دو EditTextPreference خواهیم داشت که کاربر باید ((نام)) و ((سن)) خود را در آن وارد کند. با خروج کاربر از برنامه، مقادیر وارد شده توسط وی، از بین نمی رود و درون EditTextPreference ها، دوباره همان مقادیر، نمایش داده می شود.
اگر در کدهای بالا دقت کنید، متوجه می شوید که به 4 رشته (string) ارجاع داده ایم (با نام های name و name_summary و age و age_summary) که همگی باید در فایل strings.xml تعریف شوند. بنابراین باید فایل strings.xml را باز کنیم :
کدهای فایل strings.xml را به صورت زیر می نویسیم (تعریف 4 رشته ذکر شده) :
<resources>
<string name="app_name">Kelidestan.com_SharedPreferences</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="name">name</string>
<string name="name_summary">Enter your name</string>
<string name="age">age</string>
<string name="age_summary">Enter your age</string>
<string name="server">server</string>
</resources>
یک کلاس (class) با نام Prefs.java می سازیم :
پس از ساخت کلاس (class)، کدهای آن به صورت زیر می باشد :
public class Prefs {
}
کدهای آن را به صورت زیر تغییر می دهیم :
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.view.Menu;
public class Prefs extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
// setContentView(R.layout.activity_main);
}
}
بنابراین از ویژگی های کلاس PreferenceActivity ، در این کلاس، استفاده خواهد شد (ساخت کلاس Prefs ، بر اساس توسعه دادن کلاس PreferenceActivity).
اکنون، باید فایل AndroidManifest.xml را باز کنیم :
کدهای فایل AndroidManifest.xml ، به صورت زیر می باشد :
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kelidestan.sharedpreferences"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.kelidestan.sharedpreferences.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>
</application>
</manifest>
باید خط زیر را به کدها اضافه کنیم :
بنابراین، در نهایت، کدهای فایل AndroidManifest.xml ، به صورت زیر خواهند بود :
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kelidestan.sharedpreferences"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.kelidestan.sharedpreferences.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=".Prefs"></activity>
</application>
</manifest>
خوب، تاکنون activity مربوط به SharedPreferences را با نام Pref (فایل Pref.java) ساختیم و تنظیمات مورد نظرمان را هم به آن اعمال نمودیم. اما اکنون باید گزینه ای در برنامه قرار بدهیم که توسط آن، کاربر وارد activity با نام Pref بشود. برای این منظور، باید یک دکمه (button) در activity اصلی برنامه بسازیم که کاربر با اشاره بر روی آن، وارد activity با نام Pref بشود.
ابتدا فایل activity_main.xml را که برای نمایش activity اصلی برنامه اندروید به کار می رود، باز می کنیم :
نمایش گرافیکی آن، به صورت زیر می باشد :
مشاهده می کنید که به طور پیش فرض، دارای یک TextView می باشد. ابتدا TextView را حذف کرده و سپس یک Button در آن قرار می دهیم :
بنابراین ، شکل زیر را خواهیم داشت :
سپس در properties مربوط به Button ، باید ببینیم که id آن چیست (یا id دلخواه خود را تعریف کنیم) :
بنابراین id مربوط به Button ، برابر button1 می باشد (آن را بعدا نیاز داریم).
اکنون باید به سراغ فایل MainActivity.java برویم، که همان فایل مربوط به activity اصلی برنامه اندروید ما می باشد :
در ابتدا، کدهای آن به صورت زیر می باشد :
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
کدها را به صورت زیر تغییر می دهیم (افزودن Button برای ارسال کاربر به activity با نام Prefs) :
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button b = (Button) findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Prefs.class));
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
برنامه اندروید آماده است و می توانید آن را به شیوه دلخواه خود، اجرا کنید و نتیجه را ببینید.
با اجرای برنامه اندروید، بر روی یک گوشی، صفحه زیر نمایش داده می شود :
با اشاره بر روی دکمه (Button)، صفحه زیر نمایش داده می شود :
بر روی گزینه name کلیک می کنیم تا صفحه زیر باز شود :
در کادر، نام خود را می نویسیم و سپس بر روی گزینه OK اشاره می کنیم :
حال اگر از برنامه خارج شوید یا گوشی را خاموش کنید و پس از مدتی دوباره برنامه اندروید را اجرا نمایید، با رفتن به آن صفحه، همان عبارت وارد شده را مشاهده خواهید نمود :
می توانید آن را تغییر بدهید یا بگذارید که همین عبارت، باقی بماند.
یک نکته جالب (که خودم هم آن را تست کرده ام) این است که اگر در کادر، یک عبارت را وارد کنید و سپس از برنامه خارج بشوید و یک شماره جدیدتر از آن برنامه را بر روی گوشی خود نصب نمایید، آن عبارت همچنان وجود خواهد داشت. این ویژگی، کمک می کند که کاربر، بدون از دست دادن تنظیمات انتخابی خود برای برنامه اندروید، نسخه های جدیدتر برنامه را نصب نماید (البته دقت کنید که باید بخش SharedPreferences تغییرات اساسی نداشته باشد که باعث از دست رفتن تنظیمات بشود).
فایل های پروژه اندروید را می توانید از لینک های زیر دریافت کنید :