Dialog中弹出PopupWindow

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

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

还是先贴图:

现在显示是没问题了,可是隐藏却成了问题,我点击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 感谢博主

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
安卓可以通过继承 Dialog 类,自定义底部选择器的样式和内容,然后在 Dialog 中实现底部弹的效果。以下是一个简单的示例: 1. 首先,在 res/layout 目录下新建一个布局文件(例如:custom_picker_layout.xml),用来定义选择器的样式和内容; 2. 创建一个继承自 Dialog 类的自定义 Dialog 对象(例如:CustomPickerDialog),并在其中实现底部弹的效果; 3. 在 CustomPickerDialog 中加载布局文件,并设置 Dialog 的宽度和高度,以及弹的位置(例如:底部居中); 4. 显示 CustomPickerDialog。 示例代码如下: ```java public class CustomPickerDialog extends Dialog { public CustomPickerDialog(Context context) { super(context, R.style.BottomDialogStyle); // 加载自定义布局文件 View view = LayoutInflater.from(context).inflate(R.layout.custom_picker_layout, null); // 设置 Dialog 的内容 setContentView(view); // 设置 Dialog 的属性 Window window = getWindow(); if (window != null) { // 设置 Dialog 的宽度和高度 WindowManager.LayoutParams layoutParams = window.getAttributes(); layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; window.setAttributes(layoutParams); // 设置 Dialog 的弹位置(底部居中) window.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); // 设置 Dialog 的动画效果 window.setWindowAnimations(R.style.BottomDialogAnimation); } } } ``` 注意:上述示例代码中的 BottomDialogStyle 和 BottomDialogAnimation 分别是自定义的 Dialog 样式和动画效果,可以根据实际情况替换为对应的样式和动画。另外,弹底部的选择器也可以使用 PopupWindow 实现,具体实现方式类似。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风堂主人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值