登陸界面--記住密碼、最近用戶、修改密碼

     一個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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章