在Android中設計應用程式時,若想要儲存簡單資料,可使用android.content.SharedPreferences類別,儲存如帳號、設定、上一次登入時間、遊戲關卡或電子郵件等,好讓APP在下一次執行時可讀取到這些上一次儲存下來的資料。資料的儲存格式是XML檔,儲存在Android手機中每個APP都會擁有的一個專用目錄下。
偏好設定SharedPreferences
SharedPreferences是Android的一個介面,可在Activity中呼叫getSharedPreferences(String, int)方法得到物件。
|參數:檔案名稱String|
第一個參數是定義此設定檔的檔名,不需要指定副檔名,如”atm”即寫入到atm.xml。
|參數:存取權限int|
設定這個設定檔的存取權限,有四種選擇 (0,1,2,4),我們不需要背這些值,使用Activity中已定義的常數MODE_XXX即可。在設計時鍵入大寫M後可快速選擇這些參數,如下圖:
參數的值與其說明如下:
- MODE_PRIVATE
只允許本應用程式內存取,這是最常用參數。
- MODE_MULTI_PROCESS
允許多個行程同時存取這個設定檔,這個設定在Android 2.3(含)以前都是預設啟用的,但2.3之後得要指定這個參數才允許多行程同時存取設定檔。
- MODE_WORLD_READABLE
讓手機中的所有app都能讀取這個設定檔,因為風險性太高,從API 17版開始就不建議使用這個參數了。
- MODE_WORLD_WRITEABLE
讓手機中的所有app都能存取、寫入這個設定檔,已經不建議使用了,原因與上一個參數相同。
寫入資料
寫資料時應使用SharedPreferences.Editor這個編輯器介面,可由edit()方法取得Editor物件,在Activity中寫入資料的片段程式碼如下:
String user = "jack"; SharedPreferences pref = getSharedPreferences("test", MODE_PRIVATE); pref.edit() .putString("USER", user) .commit();
第1行是將被寫入的字串user,內容為jack。
第2行,呼叫getSharedPreferences()方法,產生一個檔名為test.xml的設定儲存檔,並只供本專案(app)可讀取,物件名稱為pref。
第3-4行,呼叫edit()方法取得編輯器物件,此時使用匿名方式呼叫Editor的putString()方法將user字串的內容寫入設定檔,資料標籤為”USER”。
第5行,最後必須呼叫commit()方法,此時資料才真正寫入到設定檔中。
如果有多筆資料要寫入設定檔時,先put資料後,最後再呼叫commit()方法一次寫入,可減少寫入的次數,可兼顧SD卡的效能與降低耗損,如下片段程式:
pref.edit() .putString("USER", user) .putInt("STAGE", 3) .putFloat("HP", (float) 98.3) .commit();
第1行,呼叫edit()方法取得Editor物件。
第2-4行開始新增三筆資料,分別為字串、整數與浮點數。
第5行,最後才將三筆資料寫入設定檔。
讀取設定檔內的資料
使用SharedPreferences的方法getXX方法讀取先前已寫入的設定值,getString方法為讀取字串設定值,使用getInt方法讀取整數設定值,以此類推,還有getBoolean、getFloat、getLong與getStringSet等方法可取得對應資料型態的設定值。利用getSharedPreferences()方法先取得物件後,再讀取所需的設定值,如下程式片段:
String userid = getSharedPreferences("test", MODE_PRIVATE) .getString("USER", "");
第1行,先取得SharedPreferences物件。
第2行,取得標籤”USER”的設定值,getString方法的第二個參數是預設值(default),當讀取不到或設定檔內無該設定值時,會傳回這個預設值,本例預設是空字串。
手機內部儲存方式
本節雖然介紹了在程式設計時如何寫入與讀取設定值,但在開發實務過程中,往往需要在除錯時能夠遠端連接至手機或模擬器中,以便進行檢視或手動更改設定值。因此在下一節,筆者將介紹如何使用Android SDK的除錯工具「adb」,登入設備中並檢視設定檔的內容。
為什麼這樣
pref.edit()
.putString(“USER”, user)
.putInt(“STAGE”, 3)
.putFloat(“HP”, (float) 98.3)
.commit();
沒有問題,但是
new TextView(this)
.setText(“empty”)
.setGravity(Gravity.CENTER) —————————->這行會報錯
.setHeight(dp_to_px(60))
.setWidth(dp_to_px(60));
無論順序,第二行就是會報錯
TextView沒Builder模式。
請問如何在Adapter裡面使用getSharedPreferences()
可用建構子把 context 傳進入
設定SharedPreferences儲存後,讀取的資料一直是空值……同時找不到原因
想請問看看有是不是語法有什麼錯誤…..
登入頁面
s_id =(EditText)findViewById(R.id.number);
final String str = s_id.getText().toString();//str抓取EditText的資料
SharedPreferences pref = getSharedPreferences(“test”, MODE_PRIVATE);
pref.edit()
.putString(“USER”, str)
.commit();
……………………………………………………………………………………………………………………………………………………………………………………
//再新頁面,取用 getSharedPreferences的儲存內容
final String userid = getSharedPreferences(“test”, MODE_PRIVATE)
.getString(“USER”, “”);
Log.v(“log_tag=”,userid);
SAV=(TextView)findViewById(R.id.SAVE);
SAV.setText(userid);
//實際測試Log沒有抓到資料,但另開簡單的新專案測試是有抓到值的,SharedPreferences語法用一樣
id命名也有確認…..然而原專案卻沒法向新專案一樣抓取到資料
登入頁面完整
http://notes.io/91Vh
Post傳值完整
http://notes.io/91Vk
不好意思反覆試一直沒成功 所以來這求助….
對不起,原因弄明白了,原來是資料庫換了ip位置不好意思打掃了