編輯:關於Android編程
SharedPreferences類供開發人員保存和獲取基本數據類型的鍵值對.該類主要用於基本類型, 例如boolean,float.int,long和string.
SharedPreferences類的數據以xml文件方式存儲在本地
位置://文件存放地址 //data/data/包名/shared_pres
在應用程序結束後,數據仍舊會保存.只要程序沒有被卸載,下次啟動程序後還可以訪問上次存放的數據。
SharedPreferences對象的創建不是通過new出來的,而是getSharedPreferences(String name,int mode)方法可以獲得,這個方法是上下文裡面有的靜態方法,其第一個參數就是共享文件的名稱.第二個參數是文件數據保存的模式。對於使用同一個文件名稱獲得的多個SharedPreferences引用,其指同一個 SharePreferences對象;
從SharedPreferences對象中取值時,主要使用該類中定義的getXxx()方法.比如:
String name=share.getString(“name”);
1)判斷用戶是否第一次登錄
2)設置用戶相關默認設置開關
比如默認的聲音設置,是否要消息推送等等。
3)用於設置用戶的自動登錄等等
下面介紹一個模擬可自動登錄的示例程序:
程序功能:
1.驗證用戶名和密碼的正確性;這裡信息都是模擬的.
2.如果勾選記住密碼選框,那麼用戶登錄成功後,再退出程序,兩個輸入框會顯示上次登錄成功過的用戶名和密碼
3.如果勾選自動登錄,頁面啟動時會驗證用戶名和密碼,然後自動登錄。
4.如果沒有勾選記住密碼登錄,那麼如果之前保存的用戶名和密碼也會被移除掉。下次登錄時,用戶名和密碼的輸入框不會有任何的信息。
上面的android.support.design.widget.TextInputLayout,是android中的design包裡面的一個定義好布局樣式,相對於垂直方向的線性布局。這裡的包要導包,沒有的話,還是直接用垂直方向的線性布局代替就可以了
package com.lwz.sharepreferences; import android.content.Context; import android.content.SharedPreferences; /** * 這是一個SharePreference的根據類,使用它可以更方便的數據進行簡單存儲 * 這裡只要知道基本調用方法就可以了 * 1.通過構造方法來傳入上下文和文件名 * 2.通過putValue方法傳入一個或多個自定義的ContentValue對象,進行數據存儲 * 3.通過get方法來獲取數據 * 4.通過clear方法來清除這個文件的數據 * 這裡沒有提供清除單個key的數據,是因為存入相同的數據會自動覆蓋,沒有必要去理會 */ public class SPHelper { //定義一個SharePreference對象 SharedPreferences sharedPreferences; //定義一個上下文對象 //創建SharePreference對象時要上下文和存儲的模式 //通過構造方法傳入一個上下文 SPHelper(Context context, String fileName) { //實例化SharePreference對象,使用的是get方法,而不是new創建 //第一個參數是文件的名字 //第二個參數是存儲的模式,一般都是使用私有方式:Context.MODE_PRIVATE sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE); } /** * 存儲數據 * 這裡要對存儲的數據進行判斷在存儲 * 只能存儲簡單的幾種數據 * 這裡使用的是自定義的ContentValue類,來進行對多個數據的處理 */ //創建一個內部類使用,裡面有key和value這兩個值 static class ContentValue { String key; Object value; //通過構造方法來傳入key和value ContentValue(String key, Object value) { this.key = key; this.value = value; } } //一次可以傳入多個ContentValue對象的值 public void putValues(ContentValue... contentValues) { //獲取SharePreference對象的編輯對象,才能進行數據的存儲 SharedPreferences.Editor editor = sharedPreferences.edit(); //數據分類和存儲 for (ContentValue contentValue : contentValues) { //如果是字符型類型 if (contentValue.value instanceof String) { editor.putString(contentValue.key, contentValue.value.toString()).commit(); } //如果是int類型 if (contentValue.value instanceof Integer) { editor.putInt(contentValue.key, Integer.parseInt(contentValue.value.toString())).commit(); } //如果是Long類型 if (contentValue.value instanceof Long) { editor.putLong(contentValue.key, Long.parseLong(contentValue.value.toString())).commit(); } //如果是布爾類型 if (contentValue.value instanceof Boolean) { editor.putBoolean(contentValue.key, Boolean.parseBoolean(contentValue.value.toString())).commit(); } } } //獲取數據的方法 public String getString(String key) { return sharedPreferences.getString(key, null); } public boolean getBoolean(String key) { return sharedPreferences.getBoolean(key, false); } public int getInt(String key) { return sharedPreferences.getInt(key, -1); } public long getLong(String key) { return sharedPreferences.getLong(key, -1); } //清除當前文件的所有的數據 public void clear() { sharedPreferences.edit().clear().commit(); } }
package com.lwz.sharepreferences; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener { //定義布局內的控件 EditText et_username; EditText et_password; CheckBox cb_remenber; CheckBox cb_auto; TextView tv_login; //判斷是否自動登陸 boolean isAutoLogin = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //判斷用戶第一次登陸 idFirstlogin(); //初始化頁面數據 initView(); } private void initView() { //實例化布局的控件 et_username = (EditText) findViewById(R.id.main_et_username); et_password = (EditText) findViewById(R.id.main_et_password); cb_remenber = (CheckBox) findViewById(R.id.main_cb_remember); cb_auto = (CheckBox) findViewById(R.id.main_cb_auto); tv_login = (TextView) findViewById(R.id.main_tv_login); //對用戶登陸界面的處理 //對登陸按鈕進行監聽 tv_login.setOnClickListener(this); //給兩個選框設置監聽事件 cb_remenber.setOnCheckedChangeListener(this); cb_auto.setOnCheckedChangeListener(this); //獲取SharePreference文件數據 SPHelper helper = new SPHelper(this, "login"); //判斷用戶是否自動登陸 isAutoLogin = helper.getBoolean("isAutoLogin"); //獲取用戶名和密碼 String name = helper.getString("username"); String pass = helper.getString("password"); //如果記錄有用戶名和密碼,把用戶名和密碼放到輸入框中 if (!TextUtils.isEmpty(name)) { et_username.setText(name); et_password.setText(pass); //選中記住密碼的選框 cb_remenber.setChecked(true); } if (isAutoLogin) { Toast.makeText(this, name + "自動登陸中。。。", Toast.LENGTH_LONG).show(); //選中記住密碼的選框 cb_auto.setChecked(true); } } private void idFirstlogin() { //獲取SharedPreferences對象,這個方法沒有使用自定義類的方法來獲取對象 SharedPreferences sp = getSharedPreferences("set", MODE_PRIVATE); //獲取SharedPreferences對象裡面的某一個值 boolean isfirst = sp.getBoolean("isfirst", true); //對這個值進行判斷 if (isfirst) { //如果是第一次登陸,添加登陸過的標記,並顯示第一次登陸 SharedPreferences.Editor et = sp.edit(); et.putBoolean("isfirst", false); et.commit(); Toast.makeText(this, "第一次登陸", Toast.LENGTH_SHORT).show(); } //這個方法裡面如果使用自己定義的SPHelper類。代碼如下: /* SPHelper helper = new SPHelper(this, "set2"); boolean isfirt2 = helper.getBoolean("isfirst"); if (isfirt2) { //這裡和上面不同的是要創建一個ContentVa對象 helper.putValues(new SPHelper.ContentValue("isfirst", false)); Toast.makeText(this, "第一次登陸", Toast.LENGTH_SHORT).show(); }*/ } /** * 點擊登陸後觸發的方法 * 這裡要進行各項判斷,比如記住密碼選框和自動登陸選框的選擇情況 */ @Override public void onClick(View v) { //模擬一組數據,要輸入正確的用戶名和密碼123456 String[] name = {"李文志", "李世民", "李嘉誠", "lili"}; //獲取用戶輸入的數據 String username = et_username.getText().toString(); String password = et_password.getText().toString(); //判斷非空 if (TextUtils.isEmpty(username)) { Toast.makeText(this, "用戶名不能為空", Toast.LENGTH_SHORT).show(); return; } if (TextUtils.isEmpty(password)) { Toast.makeText(this, "密碼不能為空", Toast.LENGTH_SHORT).show(); return; } //如果用戶名和密碼正確才做相應的動作 //遍歷每一個用戶名做判斷 boolean isrightname = false; for (int i = 0; i < name.length; i++) { if (username.equals(name[i]) && password.equals("123456")) { Toast.makeText(this, "恭喜你登陸成功", Toast.LENGTH_LONG).show(); isrightname = true; //下面是數據的相關存儲 SPHelper helper = new SPHelper(this, "login"); //如果點擊記住密碼,那麼要保存密碼 if (cb_remenber.isChecked()) { //保存用戶名 helper.putValues(new SPHelper.ContentValue("username", username)); //保存密碼 helper.putValues(new SPHelper.ContentValue("password", password)); } else { //清除所有的信息 helper.clear(); } //如果點擊了自動登陸,要記住選擇的狀態 if (cb_auto.isChecked()) { //保存自動登陸的狀態 helper.putValues(new SPHelper.ContentValue("isAutoLogin", true)); } else { helper.putValues(new SPHelper.ContentValue("isAutoLogin", false)); } } } if (!isrightname) { Toast.makeText(this, "用戶名或密碼不正確!", Toast.LENGTH_LONG).show(); } } //當選框的狀態發生改變時觸發的方法 @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //當對記住密碼選框操作時 if (buttonView == cb_remenber) { //當取消時,自動登陸也要取消 if (!isChecked) { cb_auto.setChecked(false); } } //當對自動登陸選框操作時 if (buttonView == cb_auto) { //當選擇時,記住密碼也要自動去選擇 if (isChecked) { cb_remenber.setChecked(true); } } } }
其他的功能的各項測試的結果還是比較理想的。
本程序還沒有實現多個用戶名登錄的情況,比如QQ登錄的那種情況,如果要設計那中更能應該使用使用一個ExpandableList View的下拉框來顯示用戶登錄過的用戶名。
Android 3.0 中引入了加載器,支持輕松在 Activity 或片段中異步加載數據。 加載器具有以下特征:可用於每個 Activity 和 Fragment。支持
遇到的問題如下:java.lang.NullPointerException: Attempt to invoke virtual method ‘void
先看效果: 現在很多的應用效果都需要做的炫些,像UC,以及天天靜聽,效果很炫的,源碼已經對外開放了,有興趣的可以去研究下的 上源碼main.xml&l
Adapter相當於一個數據源,可以給AdapterView提供數據,並根據數據創建對應的UI,可以通過調用AdapterView的setAdapter方法使得Adapt