編輯:關於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的下拉框來顯示用戶登錄過的用戶名。
Day33-Android新的加載模式-Loader
Android 3.0 中引入了加載器,支持輕松在 Activity 或片段中異步加載數據。 加載器具有以下特征:可用於每個 Activity 和 Fragment。支持
android學習——文件下載遇到的問題及解決辦法
遇到的問題如下:java.lang.NullPointerException: Attempt to invoke virtual method ‘void
Android組件popupwindow使用方法詳解
先看效果: 現在很多的應用效果都需要做的炫些,像UC,以及天天靜聽,效果很炫的,源碼已經對外開放了,有興趣的可以去研究下的 上源碼main.xml&l
使用數據源碼解析Android中的Adapter、BaseAdapter、ArrayAdapter、SimpleAdapter和SimpleCursorAdapter
Adapter相當於一個數據源,可以給AdapterView提供數據,並根據數據創建對應的UI,可以通過調用AdapterView的setAdapter方法使得Adapt