一個App,登陸界面是少不了的,因爲我這個項目對登陸的要求不是很高,所以最初我就是用一個數據庫做的。後來發現網上別人都是用sharedpreferences做的。然後我就把兩者結合在一起做了一個,其實都是保存數據。不多說,直接上圖,看效果。(一些隱私顯示信息我已經刪掉,就是裸的登陸界面)
如果上一次登陸是記住密碼,那麼下次登陸就是記住上次登陸的用戶名和密碼,類似扣扣的登陸設計。
如果你是管理員,你可以添加新用戶,如果添加的用戶是已經存在的用戶,就認爲是修改密碼。
這裏可以顯示出已存在的用戶索引。
界面的設計主要用到的是Tab,把登陸界面和添加用戶、修改密碼分開。其他的控件都很簡單。
//標籤
TabHost tabHost = (TabHost) findViewById(R.id.mytab);
// 如果不是繼承TabActivity,則必須在得到tabHost之後,添加標籤之前調用tabHost.setup()
tabHost.setup();
// 這裏content的設置採用了佈局文件中的view
tabHost.addTab(tabHost.newTabSpec("tab1")
.setIndicator("用戶登錄").setContent(R.id.tab1));
tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("用戶管理")
.setContent(R.id.tab2));
數據庫的列只有兩條,用戶名和密碼,當然還有唯一的key:id。創建數據庫,向數據庫裏面插入,修改記錄和查詢數據庫記錄,這些在前面的文章中都多次說到了,這裏不再說。可以參考以前博文。http://blog.csdn.net/jishucai/article/details/24287841
思路是,在管理員界面把用戶的信息添加到數據庫。如果用戶信息已經存在,就表示他的操作是修改密碼,也就是對數據庫的記錄進行修改,改成新密碼。而登陸界面的判斷就是對數據庫的查詢,如果能找到記錄,且密碼和數據庫中一致,則通過驗證,否則提示各種錯誤,比方說信息不完整、用戶不存在,密碼錯誤等。
還要實現的功能是,如果這次選擇記住了密碼,下次登陸就會直接記住密碼和用戶名,用戶可以直接點登陸就可以了。
我這裏是用sharedpreferences做的,因爲不想每次都向數據庫插入兩條記錄,再次打開程序又重新讀那兩條記錄,所以我去查資料,發現原來大家的登陸都是用這個做的,基本沒有用數據庫的,不過不想改,所以我把兩者結合做了,用戶信息放在數據庫,而最近一次的用戶登陸和是否記住密碼這個checkbox信息放在了這個xml文件中。
這個sharedpreferences用起來很簡單,類似於bundle,有很多文章都說了,我這裏簡單的說,就是你首先創建一個用來存的文件,getSharedPreferences(),他的參數兩個,第一個是你要存的文件名,第二個是你存的形式,一般是MODE_PRIVATE;然後向這個文件寫內容,edit().putInt(),這是int型數據,字符型就是putString();最後就是你要用到這個文件的時候,獲取就可以了,getString();這裏的參數都是兩個,第一個都是你定義的key,他是根據你的key來寫入和讀出的,第二個肯定就是value,就是這個key對應的值。
還要實現用戶輸入一個字符(可以是漢字),就可以把數據庫中符合這樣開頭的用戶名列出來,用戶可以直接選擇。
這個使用AutocompleteTextView做的,他也是EditText的一種。可以設置他從第幾個字符開始顯示記錄,我這裏是第一個,然後就是設置對這個的監聽事件。這個改變監聽事件有三個方法:beforeTextChanged(),onTextChanged(),afterTextChanged()。從名字可以知道是做什麼的。這裏用到的是第二個和第三個方法。在第二個方法中,我們從sharedpreferences中把所有符合的記錄顯示出來;在第三個方法中,我們是判斷上一次是否記住了密碼,如果記住了,我們這次是直接查詢數據庫,把用戶的密碼顯示出來,不用用戶手動輸入。
//AutoCompleteTextView設置
sp_passwd = this.getSharedPreferences("password", MODE_PRIVATE);
sp_cb = this.getSharedPreferences("checkbox", MODE_PRIVATE);
username = (AutoCompleteTextView)findViewById(R.id.username);
username.setThreshold(1);
passwd = (EditText)findViewById(R.id.password);
passwdCB = (CheckBox)findViewById(R.id.checkBox_save);
//顯示最近一次輸入,如果記住密碼就直接全部顯示出來
username.setText(sp_cb.getString("USERNAME", ""));
if(sp_cb.getInt("CHECKBOX", 0)==0){
passwdCB.setChecked(false);
}else{
passwdCB.setChecked(true);
passwd.setText(sp_cb.getString("PASSWD", ""));
}
username.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
if(sp_cb.getInt("CHECKBOX", 0)==1){
//查詢數據庫記錄
String user = username.getText().toString();
Cursor cur = sqlitedb.rawQuery("SELECT * FROM "+SQLite.TABLE_NAME+" WHERE name='"+user+"'", null);
String temp = "";
while(cur.moveToNext()){
temp += cur.getString(2); //2代表數據列的第三列,即password
}
passwd.setText(temp);
}else{
passwd.setText("");
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
user = new String[sp_passwd.getAll().size()];// sp.getAll().size()返回的是有多少個鍵值對
user = sp_passwd.getAll().keySet().toArray(new String[0]);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_dropdown_item_1line,user);
username.setAdapter(adapter);
//查詢數據庫記錄
/*Cursor cur = sqlitedb.rawQuery("SELECT * FROM "+SQLite.TABLE_NAME, null);
int i = 0;
while(cur.moveToNext()){
user[i++] = cur.getString(1);//1代表數據列的第二列,即username
}
//String[] user =new String[]{"chz","chzz","chzzz","1",""};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_dropdown_item_1line,user);
username.setAdapter(adapter);*/
}});
這就是整個的核心。嗯,登陸按鍵的響應就是查詢數據庫,看用戶名和密碼是否和數據庫中一致。保存按鍵的響應就是向數據庫中寫入記錄,也向sharedpreferences中寫入,但是不寫入密碼,只寫入用戶名,供索引用。退出和登陸都會向sharedpreferences寫入checkbox和最近一次用戶名的信息,供下次登陸使用。
我省去了數據庫的代碼。這裏是全部代碼。
http://download.csdn.net/download/u012321815/7370705