Dialog中弹出PopupWindow

来源:互联网 发布:ubuntu移除程序 编辑:程序博客网 时间:2024/05/01 23:50

今天要做一个记住用户登陆的账号的功能,用户在切换账号的时候可以选择之前登陆过的账号,直接登陆,

在网上找了一下有了实现方法:

还是先贴图:

现在显示是没问题了,可是隐藏却成了问题,我点击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;//隐藏PopupWindowpublic 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;}@Overrideprotected 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;//是否保存当前记录为falseif (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;}@Overridepublic 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);}@Overridepublic 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();}@Overridepublic 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);}@Overridepublic int getCount() {return countList.size();}@Overridepublic Object getItem(int position) {return countList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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() {@Overridepublic 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;//删除2ImageView removeIv;//删除}}}




资料:http://www.xue5.com/Mobile/Android/657395.html 感谢博主

原创粉丝点击