/********************************************************************************************
* author:conowen@大鐘
* E-mail:conowen@hotmail.com
* http://blog.csdn.net/conowen
* 註:本文為原創,僅作為學習交流使用,轉載請標明作者及出處。
********************************************************************************************/
1、設計思路:
主要採用SharedPreferences來儲存使用者資料,本Demo沒有經過加密,所有一旦Android系統被ROOT的話,其他使用者就可以查看使用者的私人目錄,密碼檔案就很不安全。所以真正應用在軟體上面的,一定要經過加密才儲存,可以選擇MD5加密。
SharedPreferences介紹可以參看這篇博文:http://blog.csdn.net/conowen/article/details/7312612
TextWatcher的介紹可以參看這篇博文:http://blog.csdn.net/conowen/article/details/7420673
2、功能介紹
預設勾選“記住密碼”複選框,點擊“登陸”按鈕,一旦成功登陸,就儲存使用者名稱和密碼到SharedPreferences檔案中。
使用者名稱輸入時,通過TextWatcher不斷去讀取使用者資料,自動提示相應的“使用者名稱”,選擇了使用者名稱之後,就會讀取SharedPreferences的檔案,然後自動完成密碼的輸入。
3、:
4、代碼:詳細都在注釋裡面了
/*author: conowen * date: 2012.4.2 * */package com.conowen.remeberPwd;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.text.Editable;import android.text.InputType;import android.text.TextWatcher;import android.view.View;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.AutoCompleteTextView;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;public class RemeberPwdActivity extends Activity {AutoCompleteTextView cardNumAuto;EditText passwordET;Button logBT;CheckBox savePasswordCB;SharedPreferences sp;String cardNumStr;String passwordStr;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);cardNumAuto = (AutoCompleteTextView) findViewById(R.id.cardNumAuto);passwordET = (EditText) findViewById(R.id.passwordET);logBT = (Button) findViewById(R.id.logBT);sp = this.getSharedPreferences("passwordFile", MODE_PRIVATE);savePasswordCB = (CheckBox) findViewById(R.id.savePasswordCB);savePasswordCB.setChecked(true);// 預設為記住密碼cardNumAuto.setThreshold(1);// 輸入1個字母就開始自動提示passwordET.setInputType(InputType.TYPE_CLASS_TEXT| InputType.TYPE_TEXT_VARIATION_PASSWORD);// 隱藏密碼為InputType.TYPE_TEXT_VARIATION_PASSWORD,也就是0x81// 顯示密碼為InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,也就是0x91cardNumAuto.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {// TODO Auto-generated method stubString[] allUserName = new String[sp.getAll().size()];// sp.getAll().size()返回的是有多少個索引值對allUserName = sp.getAll().keySet().toArray(new String[0]);// sp.getAll()返回一張hash map// keySet()得到的是a set of the keys.// hash map是由key-value組成的ArrayAdapter<String> adapter = new ArrayAdapter<String>(RemeberPwdActivity.this,android.R.layout.simple_dropdown_item_1line,allUserName);cardNumAuto.setAdapter(adapter);// 設定資料配接器}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {// TODO Auto-generated method stub}@Overridepublic void afterTextChanged(Editable s) {// TODO Auto-generated method stubpasswordET.setText(sp.getString(cardNumAuto.getText().toString(), ""));// 自動輸入密碼}});// 登陸logBT.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubcardNumStr = cardNumAuto.getText().toString();passwordStr = passwordET.getText().toString();if (!((cardNumStr.equals("test")) && (passwordStr.equals("test")))) {Toast.makeText(RemeberPwdActivity.this, "密碼錯誤,請重新輸入",Toast.LENGTH_SHORT).show();} else {if (savePasswordCB.isChecked()) {// 登陸成功才儲存密碼sp.edit().putString(cardNumStr, passwordStr).commit();}Toast.makeText(RemeberPwdActivity.this, "登陸成功,正在擷取使用者資料……",Toast.LENGTH_SHORT).show();// 跳轉到另一個Activity// do something}}});}}
布局檔案:main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="簡單登陸DEMO" android:textSize="25px" /> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:orientation="vertical" > <LinearLayout android:layout_width="250dip" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="15dp" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <LinearLayout android:layout_width="fill_parent" android:layout_height="80px" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="40px" android:orientation="horizontal" > <TextView android:id="@+id/tv_account" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:text="用 戶 名:" android:textSize="15px" /> <AutoCompleteTextView android:id="@+id/cardNumAuto" android:layout_width="fill_parent" android:layout_height="40px" > </AutoCompleteTextView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="40px" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:text="使用者密碼:" android:textSize="15px" /> <EditText android:id="@+id/passwordET" android:layout_width="fill_parent" android:layout_height="40px" > </EditText> </LinearLayout> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <CheckBox android:id="@+id/savePasswordCB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:text="記住密碼" > </CheckBox> <Button android:id="@+id/logBT" android:layout_width="100px" android:layout_height="wrap_content" android:layout_marginLeft="40dp" android:layout_marginRight="10dp" android:text="登入" > </Button> </LinearLayout> </LinearLayout> </LinearLayout></LinearLayout>
SharedPreferences檔案,在/data/data/包名/shared_prefs檔案夾下面
<?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><string name="test">test</string><string name="test2">test</string><string name="test1">test</string></map>