今天要做一个记住用户登陆的账号的功能,用户在切换账号的时候可以选择之前登陆过的账号,直接登陆,
在网上找了一下有了实现方法:
还是先贴图:
现在显示是没问题了,可是隐藏却成了问题,我点击EditText 右边的箭头可以弹出PopupWindow,
可是再点击该按钮,和点击PopupWindow以外的区域,点击Back键都隐藏不了,必须点击PopupWindow中listview的Item的时候它才会隐藏,
之前在Activity中是可以的,为什么在Dialogz中却不行呢。
mPopup.setOutsideTouchable(true);这句话就是让点击PopupWindow外面的时候让它隐藏的,但是在Dialog中加了却也隐藏不了。
再到网上找了一下,我尝试的加了一下两句话:
mPopup.setAnimationStyle(android.R.style.Animation_Dialog);
mPopup.setBackgroundDrawable(new BitmapDrawable());
这下可以实现点击PopupWindow以外的区域也让它隐藏了。
再贴一下图片:
贴一下代码:
package com.lordcard.ui.view.dialog;
import game.card.dizhu.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.text.InputType;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.lordcard.common.exception.CrashApplication;
import com.lordcard.common.util.ActivityUtils;
import com.lordcard.common.util.DialogUtils;
import com.lordcard.common.util.EncodeUtils;
import com.lordcard.common.util.JsonHelper;
import com.lordcard.common.util.MultiScreenTool;
import com.lordcard.constant.Constant;
import com.lordcard.constant.Database;
import com.lordcard.entity.GameUser;
import com.lordcard.entity.JsonResult;
import com.lordcard.net.http.HttpRequest;
import com.lordcard.ui.LoginActivity;
/**
* 切换账号对话框
*
* @ClassName: ChangeAccountDialog
* @Description: TODO
* @author zhenggang
* @date 2013-5-29 下午3:04:28
*/
public class ChangeAccountDialog extends Dialog implements OnClickListener, OnItemClickListener,OnDismissListener {
private Context context;
private EditText accountEdt, passwordEdt;
private Button loginBtn, closeBtn;
private TextView forgetPasswordTv, titleTv;
private Handler handler;
private ProgressDialog progressDialog;
private MultiScreenTool mst = MultiScreenTool.singleTonHolizontal();
private RelativeLayout layout;
private Thread loginThread;
private ArrayList<Map<String, String>> countList = new ArrayList<Map<String, String>>();
private ImageView mImageView;//下拉箭头
private PopupWindow mPopup;
private boolean mShowing;
private PptAdapter mAdapter;
private ListView mListView;
private boolean mInitPopup;
private Handler mHander;
private static final int REFRESH = 12200;//刷新
private static final int HIT_PPT = 12201;//隐藏PopupWindow
public static final String ACCOUNT_PWD = "account_pwd";
public static final String ACCOUNT_SORT = "account_sort";
public ChangeAccountDialog(Context context) {
super(context, R.style.dialog);
this.context = context;
}
public ChangeAccountDialog(Context context, Handler handler) {
super(context, R.style.dialog);
this.context = context;
this.handler = handler;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game_login_dialog);
initDate();
layout(context);
layout = (RelativeLayout) findViewById(R.id.login_dialog_wh_mst);
mst.adjustView(layout);
mImageView = (ImageView) findViewById(R.id.show);
mImageView.setOnClickListener(this);
mHander = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case REFRESH:
mAdapter.notifyDataSetChanged();
break;
case HIT_PPT:
if (mPopup.isShowing()) {
mPopup.dismiss();
}
break;
default:
break;
}
};
};
}
/**
* 初始化数据
*/
private void initDate() {
// 保存登录的用户和密码
SharedPreferences preferences = CrashApplication.getInstance().getSharedPreferences(Constant.LOCAL_ACCOUNT, Context.MODE_PRIVATE);
Map<String, Object> userMap = (Map<String, Object>) preferences.getAll();
boolean hasSave = false;//是否保存当前记录为false
if (null != Database.USER && null != userMap && userMap.size() > 0) {
String ccount = Database.USER.getRelaAccount();
String password = Database.USER.getMd5Pwd();
// 把map 集合转换成Iterator 迭代数据
Iterator keyValuePairs = userMap.entrySet().iterator();
for (int i = 0; i < userMap.size(); i++) {
Map.Entry entry = (Map.Entry) keyValuePairs.next();
String key = (String) entry.getKey();//账号
String value = (String) entry.getValue();//密码
if (!Constant.LAST_ACCOUNT.equals(key) && !Constant.LAST_PASSWORD.equals(key)) {
if (ccount.equals(key)) {//已经缓存
hasSave = true;
}
Map<String, String> map = new HashMap<String, String>();
map.put(ACCOUNT_PWD, value);
map.put(ACCOUNT_SORT, key);
countList.add(map);
}
}
if (!hasSave) {//未做缓存
Map<String, String> map = new HashMap<String, String>();
map.put(ACCOUNT_PWD, password);
map.put(ACCOUNT_SORT, ccount);
countList.add(map);
}
}
}
/**
* 布局
*
* @param context
*/
private void layout(final Context context) {
titleTv = (TextView) findViewById(R.id.dialog_title_tv);
titleTv.setText("账号登录");
accountEdt = (EditText) findViewById(R.id.login_dl_account);
accountEdt.setHint("账号");
accountEdt.setCompoundDrawables(getDrawable(context, R.drawable.login_person), null, null, null);
if (countList.size() > 0) {
accountEdt.setText(countList.get(countList.size() - 1).get(ACCOUNT_SORT));
}
passwordEdt = (EditText) findViewById(R.id.login_dl_account_pwd);
passwordEdt.setHint("密码");
passwordEdt.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
passwordEdt.setCompoundDrawables(getDrawable(context, R.drawable.login_key), null, null, null);
if (countList.size() > 0) {
passwordEdt.setText(countList.get(countList.size() - 1).get(ACCOUNT_PWD));
}
forgetPasswordTv = (TextView) findViewById(R.id.login_dl_forget_pwd);
forgetPasswordTv.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);// 下划线
forgetPasswordTv.setText("找回密码");
forgetPasswordTv.setOnClickListener(this);
loginBtn = (Button) findViewById(R.id.login_dl_login_btn);
loginBtn.setText("登陆");
loginBtn.setOnClickListener(this);
closeBtn = (Button) findViewById(R.id.dialog_close_btn);
closeBtn.setOnClickListener(this);
}
private Drawable getDrawable(Context context, int imgID) {
Drawable drawable = context.getResources().getDrawable(imgID);
// / 这一步必须要做,否则不会显示.
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
return drawable;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login_dl_login_btn:// 登陆
mst.unRegisterView(layout);
login();
break;
case R.id.dialog_close_btn:// 退出
accountEdt.setText("");
passwordEdt.setText("");
mst.unRegisterView(layout);
dismiss();
break;
case R.id.login_dl_forget_pwd:// 忘记密码
FindPwdDialog findPwdDialog = new FindPwdDialog(context);
findPwdDialog.show();
break;
case R.id.show:// 弹出下拉列表
if (countList != null && countList.size() > 0 && !mInitPopup) {
mInitPopup = true;
initPopup();
}
if (mPopup != null) {
if (!mShowing) {
mPopup.showAsDropDown(accountEdt, 0, -3);
mShowing = true;
mImageView.setImageResource(R.drawable.ppt_up);
} else {
mPopup.dismiss();
}
}
break;
default:
break;
}
}
/**
* 弹出下拉列表
*/
private void initPopup() {
mAdapter = new PptAdapter(context);
mListView = new ListView(context);
mListView.setCacheColorHint(Color.TRANSPARENT);//去除滑动时的背景色
mListView.setBackgroundResource(R.drawable.lv_item_bg);
mListView.setVerticalScrollBarEnabled(false);//去除滚动条
mListView.setDivider(null);//去除listview的Item间的分割线
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(this);
int height = ViewGroup.LayoutParams.WRAP_CONTENT;
int width = accountEdt.getWidth();
System.out.println(width);
mPopup = new PopupWindow(mListView, width, height, true);
mPopup.setOutsideTouchable(true);
mPopup.setAnimationStyle(android.R.style.Animation_Dialog);
mPopup.setBackgroundDrawable(new BitmapDrawable());
mPopup.setOnDismissListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
accountEdt.setText(countList.get(position).get(ACCOUNT_SORT));
passwordEdt.setText(countList.get(position).get(ACCOUNT_PWD));
mPopup.dismiss();
}
@Override
public void onDismiss() {
mShowing = false;
mImageView.setImageResource(R.drawable.ppt_down);
}
/**
* 登陆
*/
private void login() {
final String account = accountEdt.getText().toString();
final String password = passwordEdt.getText().toString();
if (TextUtils.isEmpty(account) || TextUtils.isEmpty(password)) {
DialogUtils.toastTip("账号或密码不能为空");
return;
}
progressDialog = DialogUtils.getWaitProgressDialog(context, "请稍候...");
progressDialog.show();
loginThread = new Thread() {
public void run() {
// 登录
String psw = password;
if (password.startsWith("#")) {//如果密码以"#"为前缀,标示是注册时生成的密码,需去掉前缀
// psw=password.substring(1, password.length());
handler.sendEmptyMessage(LoginActivity.RESIGSTER_USER); // 通知注册账号
dismiss();
progressDialog.dismiss();
} else {//如果密码不以"#"为前缀,标示为用户输入的密码,需要用MD5加密
psw = EncodeUtils.MD5(password).toUpperCase();
String result = HttpRequest.login(account, psw);
JsonResult jsonResult = JsonHelper.fromJson(result, JsonResult.class);
progressDialog.dismiss();
if (JsonResult.SUCCESS.equals(jsonResult.getMethodCode())) {
String gameUserJson = jsonResult.getMethodMessage();
GameUser gameUser = JsonHelper.fromJson(gameUserJson, GameUser.class);
gameUser.setUserPwd(gameUser.getMd5Pwd());
gameUser.setMd5Pwd(password);
Database.USER = gameUser;
Database.SIGN_KEY = gameUser.getAuthKey();
ActivityUtils.saveLoginAccount(account, password);
if (handler != null) {
handler.sendEmptyMessage(LoginActivity.UPDATE_USER); // 通知页面更新展示账号
}
dismiss();
} else {
DialogUtils.mesTip(jsonResult.getMethodMessage(), false);
}
}
};
};
loginThread.start();
}
private class PptAdapter extends BaseAdapter {
private Context context;
private LayoutInflater layoutInflater = null;
public PptAdapter(Context context) {
this.context = context;
this.layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return countList.size();
}
@Override
public Object getItem(int position) {
return countList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder mViewHolder = null;
if (null == convertView) {
convertView = layoutInflater.inflate(R.layout.cad_edit_ppt_lv_item, null);
mViewHolder = new ViewHolder();
mViewHolder.ccountTv = (TextView) convertView.findViewById(R.id.cad_edit_ppt_lv_id_tv);
mViewHolder.removeIv2 = (ImageView) convertView.findViewById(R.id.cad_edit_ppt_lv_delet_iv2);
mViewHolder.removeIv = (ImageView) convertView.findViewById(R.id.cad_edit_ppt_lv_delet_iv);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder) convertView.getTag();
}
mViewHolder.ccountTv.setText(countList.get(position).get(ACCOUNT_SORT));
mViewHolder.removeIv.setOnClickListener(new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
if (!countList.get(position).get(ACCOUNT_PWD).startsWith("#")) {//如果是注册的账号则不允许删除
//删除同时删除本地缓存
SharedPreferences preferences = CrashApplication.getInstance().getSharedPreferences(Constant.LOCAL_ACCOUNT,
Context.MODE_PRIVATE);
Editor editor = preferences.edit();
editor.remove(countList.get(position).get(ACCOUNT_SORT));
editor.commit();
SharedPreferences preferencesLast = CrashApplication.getInstance().getSharedPreferences(Constant.LAST_SIGN,
Context.MODE_PRIVATE);
String accountLast = preferencesLast.getString(Constant.LAST_ACCOUNT, null);
if (countList.get(position).get(ACCOUNT_SORT).equals(accountLast)) {// 如果与最后一次登陆的相同,则同时删除最后一次登陆的账号
Editor editorLast = preferencesLast.edit();
editorLast.remove(Constant.LAST_ACCOUNT);
editorLast.remove(Constant.LAST_PASSWORD);
editorLast.commit();
}
countList.remove(position);
if (0 == countList.size()) {
mHander.sendEmptyMessage(HIT_PPT);
}
mHander.sendEmptyMessage(REFRESH);
}
}
});
if (!TextUtils.isEmpty(countList.get(position).get(ACCOUNT_PWD)) && countList.get(position).get(ACCOUNT_PWD).startsWith("#")) {//如果是注册账号则不显示删除按钮
mViewHolder.removeIv.setVisibility(View.INVISIBLE);
mViewHolder.removeIv2.setVisibility(View.INVISIBLE);
} else {
mViewHolder.removeIv.setVisibility(View.VISIBLE);
mViewHolder.removeIv2.setVisibility(View.VISIBLE);
}
return convertView;
}
private class ViewHolder {
TextView ccountTv;//账号
ImageView removeIv2;//删除2
ImageView removeIv;//删除
}
}
}
资料:http://www.xue5.com/Mobile/Android/657395.html 感谢博主