当前项目中有一个需求,就是需要在当前app中不退出直接切换账号,一般这种需求大多都是测试或者手机用户比较多的,所以在现有项目中添加一个不算过分的需求,实现起来也很简单,就是在登录成功之后用数据库实现保存用户名和密码,然后适配器切换账号的时候调用数据库保存的信息,直接把相关的用户名和密码填入输入框,实现登录。
具体实现方法如下:
mOptionsDBHelper.open();
if (!mOptionsDBHelper.isOneExist(mEditText1.getText().toString())) { mUserNames.add(mEditText1.getText().toString());
mOptionsAdapter.notifyDataSetChanged();
}mOptionsDBHelper.close();
storeAccount();
用到了适配器和数据库:
/** * @ClassName OptionsAdapter *
@Description TODO 可选择下拉列表适配器 *
@Version 1.0 * @Author jairkong *
@Creation 2013-8-1 下午4:00:11 *
@Mender jairkong *
@Modification 2013-8-1 下午4:00:11 **/
public class OptionsAdapter extends BaseAdapter {
private List list = new ArrayList();
private Context mContext;
public OptionsAdapter(Context context, List list){
this.mContext = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder= null;
if (convertView == null) {
holder= new ViewHolder();
//下拉项布局
convertView = LayoutInflater.from(mContext).inflate(R.layout.option_item, null);
holder.relativeLayout=(RelativeLayout)convertView.findViewById(R.id.option_item_layout);
holder.textView = (TextView) convertView.findViewById(R.id.option_item_text);
holder.delBtn = (ImageView) convertView.findViewById(R.id.option_item_del);
convertView.setTag(holder);
} else {
holder= (ViewHolder) convertView.getTag();
}
holder.textView.setText(list.get(position));
//为下拉框选项文字部分设置事件,最终效果是点击将其文字填充到文本框
holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnClicked.onItemSelected(position);
}
});
//为下拉框选项删除图标部分设置事件,最终效果是点击将该选项删除
holder.delBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnClicked.onItemDelete(position);
}
});
return convertView;
}
public OnClicked mOnClicked;
public void setOnClicked(OnClicked onClicked)
{
mOnClicked=onClicked;
}
public interface OnClicked
{
void onItemDelete(int index);
void onItemSelected(int index);
}
}
class ViewHolder {
RelativeLayout relativeLayout;
TextView textView;
ImageView delBtn;
}
/**
* @ClassNameOptionsDBHelper
* @DescriptionTODO 数据库操作辅助类
* @Version1.0
* @Authorjairkong
* @Creation2013-8-2 上午10:41:50
* @Menderjairkong
* @Modification2013-8-2 上午10:41:50
**/
public class OptionsDBHelper {
private static final boolean D=true;
private static final String TAG="---OptionsDBHelper---";//LogCat
private static final String DB_NAME="options.db";//数据库名
private static final String DB_TABLE="accounts";//数据库表名
private static final int DB_VERSION=1;//数据库版本号
private Context mContext;
private DBHelper dbHelper;
private SQLiteDatabase database;
public OptionsDBHelper(Context context) {
// TODO Auto-generated constructor stub
this.mContext=context;
}
public boolean isOpen()
{
if (database.isOpen())
{
return true;
} else {
return false;
}
}
/**
* @功能 打开数据库
* 空间不够存储的时候设为只读
* @throwsSQLiteException
**/
public boolean open() throws SQLiteException{
dbHelper = new DBHelper(mContext, DB_NAME, null,DB_VERSION);
try
{
database = dbHelper.getWritableDatabase();
return true;
}
catch (SQLiteException e)
{
database = dbHelper.getReadableDatabase();
return false;
}
}
/**
* @功能 关闭数据库
*
**/
public void close() {
if (database!=null) {
database.close();
database=null;
}
Log.e(TAG, "close()");
}
/**
* @功能 更新选中账号记录
* @return
**/
public void updateState(String name) {
if (name!=null)
{
database.execSQL("UPDATE "+DB_TABLE+" SET "+DBHelper.KEY_LAST_ACC+
" = 1 WHERE "+DBHelper.KEY_USERNAME+" = "+"\""+name+"\";");
database.execSQL("UPDATE "+DB_TABLE+" SET "+DBHelper.KEY_LAST_ACC+
" = 0 WHERE "+DBHelper.KEY_USERNAME+" <> "+"\""+name+"\";");//将其它的置为0
}
else
{
database.execSQL("UPDATE "+DB_TABLE+" SET "+DBHelper.KEY_LAST_ACC+
" = 0 ;");//将其它的置为0
}
}
/**
* @功能 向表中添加一条数据
* @return
**/
public long insert( UserAccount userAccount) {
ContentValues contentValues=new ContentValues();
contentValues.put(DBHelper.KEY_USERNAME, userAccount.getUserName());
contentValues.put(DBHelper.KEY_PASSWORD, userAccount.getPassWord());
contentValues.put(DBHelper.KEY_REMB_PWD, (userAccount.getRembPwd())?1:0);
contentValues.put(DBHelper.KEY_AUTO_LOG, (userAccount.getAutoLog())?1:0);
contentValues.put(DBHelper.KEY_LAST_ACC, (userAccount.getLastAcc())?1:0);
return database.insert(DB_TABLE, null, contentValues);
}
/**
* @功能 向表中删除一条数据
* @return
**/
public long deleteOne(String name) {
return database.delete(DB_TABLE, DBHelper.KEY_USERNAME+"="+"\""+name+"\"", null);
}
/**
* @功能 删除数据表
* @return
**/
public long deleteAllData() {
return database.delete(DB_TABLE,null,null);
}
/**
* @功能 获得上一次登录的账号
* @param
* @return
**/
public UserAccount queryLastAcc() {
UserAccount userAccount=null;
Cursor result=database.query(DB_TABLE, null, DBHelper.KEY_LAST_ACC+"="+"\""+String.valueOf(1)+"\"", null, null, null, null);
Log.e(TAG, "queryOneData()---result:"+result.getColumnCount());
if (result.getCount()>0)
{
userAccount=ConvertAll(result)[0];
}
result.close();
return userAccount;
}
/**
* @功能 根据包名查询一条数据
* @param
* @return
**/
public UserAccount queryOne(String name) {
UserAccount userAccount;
Cursor result=database.query(DB_TABLE, null, DBHelper.KEY_USERNAME+"="+"\""+name+"\"", null, null, null, null);
Log.e(TAG, "queryOneData()---result:"+result.getColumnCount());
userAccount=ConvertAll(result)[0];
result.close();
return userAccount;
}
/**
* @功能 查询全部数据记录数量
* @return
**/
public int queryDataCount(){
int count=0;
Cursor result= database.query(DB_TABLE, null, null, null, null, null, null);
count=result.getCount();
result.close();
return count;
}
/**
* @功能 查询全部数据
* @return
**/
public UserAccount[] queryAllData(){
UserAccount[] userAccounts;
Cursor result= database.query(DB_TABLE, null, null, null, null, null, null);
userAccounts=ConvertAll(result);
result.close();
return userAccounts;
}
/**
* @功能 根据包名更新一条数据
* @param
* @returnlong
**/
public long updateOne(String name,UserAccount userAccount){
ContentValues contentValues=new ContentValues();
contentValues.put(DBHelper.KEY_USERNAME, userAccount.getUserName());
contentValues.put(DBHelper.KEY_PASSWORD, userAccount.getPassWord());
contentValues.put(DBHelper.KEY_REMB_PWD, (userAccount.getRembPwd())?1:0);
contentValues.put(DBHelper.KEY_AUTO_LOG, (userAccount.getAutoLog())?1:0);
contentValues.put(DBHelper.KEY_LAST_ACC, (userAccount.getLastAcc())?1:0);
return database.update(DB_TABLE, contentValues, DBHelper.KEY_USERNAME+"="+"\""+name+"\"",null);
}
/**
* @功能 根据包名查询一条数据是否存在
* @param
* @return
**/
public boolean isOneExist(String name) {
Cursor result=database.query(DB_TABLE, null, DBHelper.KEY_USERNAME+"="+"\""+name+"\"", null, null, null, null);
if(result.getCount() == 0 || !result.moveToFirst())
{
result.close();
return false ;
}else {
result.close();
return true;
}
}
private UserAccount[] ConvertAll(Cursor cursor){
int resultCounts= cursor.getCount();
if (D)Log.e(TAG, "ConvertToAppInfo()---resultCounts:"+resultCounts);
if(resultCounts== 0 || !cursor.moveToFirst())
{
return null ;
}
UserAccount[] userAccounts= new UserAccount[resultCounts];
Log.i(TAG, "AppInfo length:"+userAccounts.length);
for (int i= 0; i< resultCounts; i++)
{
userAccounts[i] = new UserAccount();
userAccounts[i].setUserName(cursor.getString(cursor.getColumnIndex(DBHelper.KEY_USERNAME)));
userAccounts[i].setPassWord(cursor.getString(cursor.getColumnIndex(DBHelper.KEY_PASSWORD)));
userAccounts[i].setRembPwd(((byte)(cursor.getInt(cursor.getColumnIndex(DBHelper.KEY_REMB_PWD)))==1)?true:false);
userAccounts[i].setAutoLog(((byte)(cursor.getInt(cursor.getColumnIndex(DBHelper.KEY_AUTO_LOG)))==1)?true:false);
userAccounts[i].setLastAcc(((byte)(cursor.getInt(cursor.getColumnIndex(DBHelper.KEY_LAST_ACC)))==1)?true:false);
cursor.moveToNext();
}
cursor.close();
return userAccounts;
}
public class UserAccount {
private String mUserName="", mPassWord="";
private boolean mLastAcc=false, mRembPwd=true, mAutoLog=false;
/**
* @NameOptionsDBHelper.UserAccounts
* @DescriptionTODO
* @Date2013-8-2 下午1:01:42
**/
public UserAccount()
{
// TODO Auto-generated constructor stub
}
public UserAccount(String username, String password, boolean lastacc, boolean rempwd, boolean autolog)
{
this.mUserName=username;
this.mPassWord=password;
this.mRembPwd=rempwd;
this.mAutoLog=autolog;
this.mLastAcc=lastacc;
}
public void setUserName(String un)
{
this.mUserName=un;
}
public String getUserName()
{
return this.mUserName;
}
public void setPassWord(String pwd)
{
this.mPassWord=pwd;
}
public String getPassWord()
{
return this.mPassWord;
}
public void setRembPwd(boolean rem)
{
this.mRembPwd=rem;
}
public boolean getRembPwd()
{
return this.mRembPwd;
}
public void setAutoLog(boolean auto)
{
this.mAutoLog=auto;
}
public boolean getAutoLog()
{
return this.mAutoLog;
}
public void setLastAcc(boolean la)
{
this.mLastAcc=la;
}
public boolean getLastAcc()
{
return this.mLastAcc;
}
@Override
public String toString(){
String str=
"账号:"+this.mUserName+","
+"密码:"+this.mPassWord+","
+"记住密码:"+this.mRembPwd+","
+"自动登录:"+this.mAutoLog+","
+"是否为上次账号:"+this.mLastAcc;
return str;
}
}
public class DBHelper extends SQLiteOpenHelper {
public static final boolean D=true;
public static final String TAG="---DBHelper---";//LogCat
private static final String DB_TABLE="accounts";//数据库表名
private static final int DB_VERSION=1;//数据库版本号
private static final String KEY_USERNAME = "UserName";
private static final String KEY_PASSWORD = "PassWord";
private static final String KEY_REMB_PWD = "RembPwd";
private static final String KEY_AUTO_LOG = "AutoLog";
private static final String KEY_LAST_ACC = "LastAcc";
private static final String CREATE_TABLE_SQL=
"CREATE TABLE "+DB_TABLE
+" ("+KEY_USERNAME+" VARCHAR(32) NOT NULL PRIMARY KEY, "
+KEY_PASSWORD+" VARCHAR(32) NOT NULL, "
+KEY_REMB_PWD+" BIT(1) DEFAULT 1, "
+KEY_AUTO_LOG+" BIT(1) DEFAULT 0, "
+KEY_LAST_ACC+" BIT(1) DEFAULT 0);";
public DBHelper(Context context, String name,CursorFactory factory, int version)
{
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db){
// 第一个使用数据库时自动建表
db.execSQL(CREATE_TABLE_SQL);
}
/**
*
* 函数在数据库需要升级时被调用, 一般用来删除旧的数据库表,并将数据转移到新版本的数据库表中
*
**/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
db.execSQL("DROP TABLE IF EXISTS "+CREATE_TABLE_SQL);
onCreate(db);
if (D)Log.i(TAG, "Upgrade");
}
}
}
在登录的Activity里面条用的方法如下:
/**
* @returnvoid
* @NameinitData
* @DescriptionTODO 初始化数据
* @Authorfzq
* @Date2018-5-2 下午8:18:43
**/
public void initData() {
mCount = restoreAccounts();
OptionsDBHelper.UserAccount userAccount= restoreLastAccount();
if (mCount > 0 && userAccount!= null) {
mEditText1.setText(userAccount.getUserName());
mEditText2.setText(userAccount.getPassWord());
}
//PopupWindow浮动下拉框布局
layout_option = (View) this.getLayoutInflater().inflate(R.layout.layout_options, null);
ListView listView= (ListView) layout_option.findViewById(R.id.layout_options_list);
//设置自定义Adapter
mOptionsAdapter = new OptionsAdapter(LoginActivity.this, mUserNames);
mOptionsAdapter.setOnClicked(onItemClicked);
listView.setAdapter(mOptionsAdapter);
}
/**
* @returnvoid
* @NamestoreAccount
* @DescriptionTODO 保存用户登陆信息
* @Authorfzq
* @Date2018-5-2 下午3:28:06
**/
public void storeAccount() {
OptionsDBHelper.UserAccount userAccount= mOptionsDBHelper.new UserAccount();
userAccount.setUserName(mEditText1.getText().toString());
userAccount.setPassWord(mEditText2.getText().toString());
userAccount.setLastAcc(true);
mOptionsDBHelper.open();
mOptionsDBHelper.updateState(mEditText1.getText().toString());
if (mOptionsDBHelper.isOneExist(mEditText1.getText().toString())) {
mOptionsDBHelper.updateOne(userAccount.getUserName(), userAccount);
} else {
mOptionsDBHelper.insert(userAccount);
}
mOptionsDBHelper.close();
}
/**
* @returnvoid
* @NamestoreUserInfo
* @DescriptionTODO 移除指定用户信息
* @Authorfzq
* @Date2018-5-2 下午3:28:06
**/
public void removeAccount(String username) {
mOptionsDBHelper.open();
mOptionsDBHelper.deleteOne(username);
mOptionsDBHelper.close();
}
/**
* @returnvoid
* @NamerestoreAccounts
* @DescriptionTODO 还原登录账号信息
* @Authorfzq
* @Date2018-5-2 上午10:59:02
**/
public int restoreAccounts() {
mOptionsDBHelper.open();
int count= mOptionsDBHelper.queryDataCount();
Log.d("restoreAccounts", "count:" + count);
if (count> 0) {
OptionsDBHelper.UserAccount[] userAccounts= new OptionsDBHelper.UserAccount[count];
userAccounts= mOptionsDBHelper.queryAllData();
mUserNames.clear();
for (OptionsDBHelper.UserAccount userAccount: userAccounts) {
mUserNames.add(userAccount.getUserName());
}
mOptionsDBHelper.close();
} else {
}
return count;
}
/**
* @returnvoid
* @NamestoreSelectedAccount
* @DescriptionTODO 保存当前用户账号
* @Authorfzq
* @Date2018-5-2 下午8:00:59
**/
public void storeSelectedAccount(String name) {
mOptionsDBHelper.open();
mOptionsDBHelper.updateState(name);
mOptionsDBHelper.close();
}
/**
* @paramname
* @returnvoid
* @NameupdateState
* @DescriptionTODO 更新选中账号状态
* @Authorfzq
* @Date2018-5-2 下午5:17:06
**/
public void updateState(String name) {
OptionsDBHelper.UserAccount userAccount= mOptionsDBHelper.new UserAccount();
mOptionsDBHelper.open();
userAccount= mOptionsDBHelper.queryOne(name);
mOptionsDBHelper.close();
mEditText1.setText(userAccount.getUserName());
mEditText2.setText(userAccount.getPassWord());
}
/**
* @returnvoid
* @NamerestoreLastAccount
* @DescriptionTODO 恢复上次记住用户账号信息
* @Authorfzq
* @Date2018-5-2 下午8:11:26
**/
public OptionsDBHelper.UserAccount restoreLastAccount() {
OptionsDBHelper.UserAccount userAccount= mOptionsDBHelper.new UserAccount();
mOptionsDBHelper.open();
userAccount= mOptionsDBHelper.queryLastAcc();
mOptionsDBHelper.close();
return userAccount;
}
/**
* @returnboolean
* @NamejudgeLoginInfo
* @DescriptionTODO 检查登录信息是否符合要求
* @Data2018-5-2
**/
protected boolean judgeLoginInfo() {
// TODO Auto-generated method stub
Animation shakeAnimY, shakeAnimX;
boolean isUserOK= false, isPwdOK= false;
shakeAnimX= AnimationUtils.loadAnimation(LoginActivity.this, R.anim.shake_x);
shakeAnimY= AnimationUtils.loadAnimation(LoginActivity.this, R.anim.shake_y);
if (mEditText1.getText().toString().length() == 0 || mEditText2.getText().toString().length() == 0) {
Toast.makeText(LoginActivity.this, getResources().getString(R.string.login_input_blank), Toast.LENGTH_SHORT).show();
mEditText1.startAnimation(shakeAnimY);
mEditText2.startAnimation(shakeAnimY);
isUserOK= false;
isPwdOK= false;
} else {
if (mEditText1.getText().toString().length() > 32 || mEditText1.getText().toString().length() < 4) {//4字符?
Toast.makeText(LoginActivity.this, getResources().getString(R.string.login_username_length), Toast.LENGTH_SHORT).show();
mEditText1.startAnimation(shakeAnimY);
// et_userName.setText("");
isUserOK= false;
} else {
isUserOK= true;
}
if (mEditText2.getText().toString().length() > 32 || mEditText2.getText().toString().length() < 6) {//6字符
Toast.makeText(LoginActivity.this, getResources().getString(R.string.login_password_length), Toast.LENGTH_SHORT).show();
mEditText2.startAnimation(shakeAnimY);
mEditText2.setText("");
isPwdOK= false;
} else {
isPwdOK= true;
}
}
if (isPwdOK& isUserOK) {
return true;
} else {
return false;
}
}
/**
* @returnvoid
* @NameuploadOptionPop
* @DescriptionTODO 打开账号选择Popupwindow
* @Authorfzq
* @Date2018-5-2 下午9:47:05
**/
private void uploadOptionPop(boolean show_flag) {
if (show_flag) {
if (selectPopupWindow != null) {
if (selectPopupWindow.isShowing()) {
selectPopupWindow.dismiss();
}
selectPopupWindow = null;
}
selectPopupWindow = new PopupWindow(layout_option, linear.getWidth(), LinearLayout.LayoutParams.FILL_PARENT, true);
selectPopupWindow.setBackgroundDrawable(new BitmapDrawable());// 设置允许在外点击消失
selectPopupWindow.showAsDropDown(linear, 0, 0);
selectPopupWindow.setAnimationStyle(R.style.PopupAnimation);
selectPopupWindow.setFocusable(true);
selectPopupWindow.setOutsideTouchable(true);
selectPopupWindow.update();
} else {
if (selectPopupWindow != null) {
selectPopupWindow.dismiss();
selectPopupWindow.setFocusable(false);
}
}
}
在初始化的时候别忘了加上:
mOptionsDBHelper = new OptionsDBHelper(LoginActivity.this);
initData();
还有就是布局文件,很简单的,我就不一一贴出来了,有需要的话联系我!
网友评论