《Andrioid_Popupwindow案例》popWindow做Menu,popWindow做选项菜单

先看效果,上图展示了最近在开发的项目经常用到的pop案例,包括一般的选项,下拉选项,menu等,布局就不贴了,很简单

相信都能秒懂,贴下pop的核心代码

/**
 *
 * @author yaguang.wang
 *
 */
public class MenuPop extends PopupWindow {

	private int resId;
	private Context mContext;
	private View popView;
	private LayoutInflater inflater;
	public MenuPop(int resId,Context context) {
		super(context);
		this.resId = resId;
		mContext = context;
		inflater=(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		init();
	}

	@SuppressWarnings("deprecation")
	public void init(){

		popView = inflater.inflate(this.resId, null);
		popView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
		setContentView(popView);
		setWidth(LayoutParams.FILL_PARENT);
		setHeight(LayoutParams.WRAP_CONTENT);
		setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
		setFocusable(true);

		Button btn1 = (Button) popView.findViewById(R.id.menu_btn1);
		Button btn2 = (Button) popView.findViewById(R.id.menu_btn2);
		Button btn3 = (Button) popView.findViewById(R.id.menu_btn3);
		Button btn4 = (Button) popView.findViewById(R.id.menu_btn4);

		btn1.setOnClickListener(new ButtonListener());
		btn2.setOnClickListener(new ButtonListener());
		btn3.setOnClickListener(new ButtonListener());
		btn4.setOnClickListener(new ButtonListener());

		popView.setFocusableInTouchMode(true);

		popView.setOnKeyListener(new View.OnKeyListener() {

				@Override
				public boolean onKey(View v, int keyCode, KeyEvent event) {

					if(keyCode == KeyEvent.KEYCODE_MENU && isShowing()){
						dismiss();
						return true;
					}
					return false;
				}
			});
	}
	private class ButtonListener implements View.OnClickListener{

		@Override
		public void onClick(View v) {
			Toast.makeText(mContext, "view id is"+v.getId(), Toast.LENGTH_SHORT).show();
			if (isShowing()) {
				dismiss();
			}
		}
	}
}

上面就是menupop的源代码。能实现pop按Menu键可以弹出,再次menu键消失,点击其他区域,或按下返回键,或者pop的view有点击事件的时候pop消失。这里具体借鉴了http://blog.csdn.net/admin_/article/details/7278402 这篇文章,这篇文章写的不错。刚开始也遇到了pop弹出来不消失的情况,

setFocusable(true);

popView.setFocusableInTouchMode(true);

这两个方法很关键。pop在弹出的之后就变成了僵尸View,但是Pop里面的View还是可以接收事件的,但是这时候要先把焦点传给pop的view,这样View是可以响应onkeydown事件和onClick事件的。问题得到解决。

/**
 *
 * @author yaguang.wang
 *
 */
public class GridPop extends PopupWindow {
	private Context context;
	private LayoutInflater layoutInflater;
	public View allView;
	private int resId;
	private GridView allItemGrid;
	public GridPop(Context context,int resourceId) {
		super(context);
		this.context = context;
		this.resId=resourceId;
		initAllPop();
	}
	public void initAllPop() {
		layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		allView = layoutInflater.inflate(resId, null);
		allView.setFocusable(true);
		allView.setFocusableInTouchMode(true);
		allItemGrid = (GridView) allView.findViewById(R.id.pop_grid);
		allView.setFocusableInTouchMode(true);
		allView.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if (isShowing()) {
					dismiss();
					return true;
				}
				return false;
			}
		});

		DisplayMetrics dm=new DisplayMetrics();
		((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
		setContentView(allView);
		setWidth(dm.widthPixels/2);
		setHeight(LayoutParams.WRAP_CONTENT);
		setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
		setTouchable(true);
		setFocusable(true);
		setOutsideTouchable(true);

	}

	/**
	 *
	 * @return 返回该pop中GridView,可以其他地方设置该GridView
	 */
	public GridView getAllItemGrid() {
		return allItemGrid;
	}
}

上面是gridpop的代码。里面是gridview,其实pop里面可以填很多View的。不再赘述,在封装pop之后,只需要改下布局文件,改下数据,在其他地方就可以方便的new出来不同需求的pop。比如在基类activity做了popmenu的popwindow的操作,那么其他子activity就可以很方便的继承。

来看下MainActivity

/**
 *
 * @author yaguang.wang
 *
 */
public class Activity_Main extends Activity {
	private Button btn1,btn2;
	private MenuPop popMenu;
	private DefaultPop defaultPop;
	private GridPop gridpop;
	private ArrayList<String> stringArray;
	private GridView gv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		setContentView(R.layout.main);
		initView();
		super.onCreate(savedInstanceState);
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add("xx");//触发onMenuOpened
		return super.onCreateOptionsMenu(menu);
	}

	/**
	 * popMenu
	 */
	@Override
	public boolean onMenuOpened(int featureId, Menu menu) {
		if (popMenu!=null) {
			if (popMenu.isShowing()) {
				popMenu.dismiss();
			}
			else {
				View v=this.getLayoutInflater().inflate(R.layout.pop_menu, null);
				popMenu.showAtLocation(v, Gravity.BOTTOM, 0, 0);
			}
		}
		//为false时,才能屏蔽menu add的xx
		return false;
	}

	private void initView(){
		//弹出pop1 比较丑见谅
		btn1 = (Button) this.findViewById(R.id.main_btn1);
		//弹出pop2 比较丑见谅
		btn2 = (Button) this.findViewById(R.id.main_btn2);
		btn1.setOnClickListener(new ClickListener());
		btn2.setOnClickListener(new ClickListener());

		popMenu = new MenuPop(R.layout.pop_menu, Activity_Main.this);

		//list传值
		stringArray = new ArrayList<String>();
		for (int i = 1; i <= 20; i++) {
			stringArray.add("item"+i);
		}

		defaultPop = new DefaultPop(Activity_Main.this, R.layout.default_popwin);

		gridpop = new GridPop(Activity_Main.this, R.layout.pop_list);

		gv = gridpop.getAllItemGrid();
		gv.setAdapter(new GridViewAdapter(Activity_Main.this, stringArray));
		gv.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
					//TODO DO SOMETHING
					Toast.makeText(getApplicationContext(), "item on clicked"+position, Toast.LENGTH_SHORT).show();
					if (gridpop.isShowing()) {
						gridpop.dismiss();
					}
			}
		});
	}

	private class ClickListener implements View.OnClickListener{

		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			/**
			 * pop1 简单控件
			 */
			case R.id.main_btn1:
				if (defaultPop!=null) {
					if (defaultPop.isShowing()) {
						defaultPop.dismiss();
					} else {
						defaultPop.showAsDropDown(v);
					}
				}
				break;

			/**
			 * pop2 复杂控件
			 */
			case R.id.main_btn2:
				if (gridpop!=null) {
					if (gridpop.isShowing()) {
						gridpop.dismiss();
					} else {
						gridpop.showAsDropDown(v);
					}
				}
				break;

			}
		}

	}
}

其他部分的代码就不贴出了。共同学习,源码,在http://download.csdn.net/detail/wangyg1990/7317203

《Andrioid_Popupwindow案例》popWindow做Menu,popWindow做选项菜单,布布扣,bubuko.com

时间: 2024-10-11 13:49:45

《Andrioid_Popupwindow案例》popWindow做Menu,popWindow做选项菜单的相关文章

技术人员的未来:做技术还是做管理?

一.如何确定自己做技术还是管理 从标题来看是个很简单很朴实的问题,大部分技术人员在工作3年.5年以后都会面临这个问题,如果没有面临,说明你平常思考的太少,或者你危机要降临了.本文讨论的是通常意义的计算机相关技术人员的个人职业发展规划,如果是个人创业或者其他目标追求不在此列,我只是描述大部分普普通通的计算机工程师的问题. 中国是个官本位思想很重的国家,所有主流意识认为能够当官或者做管理的人才是有出头的,才是有出息的,才是王道,才会被亲朋好友同事同学瞧得起,其实,不尽然. 我说点大块的,比如说,如果

无责任励志一则-成功就是把你做的事做精致

无责任励志一则-成功就是把你做的事做精致 读tomcat和spring的源码,结果根本没能坚持下去.因为根本没那么多时间去阅读代码,也坚持不下去,最后都是不了了之.现在想来,根本不是对这些项目感兴趣,其实平时用到的功能也不全,完全是因为觉得它们很牛逼. HDFS是Nutch为了保存海量文件而开发的,而Hadoop本身也是起源于项目需要. 现在的工作,我一直在做一些跑job的事情,大家都觉得挺无聊.但是想想,其实那么高端大气的Hadoop也是从跑job开始的.何不好好干呢?

做管理还是做技术

做管理还是做技术? 如果你现在问我,我会毫不犹豫地告诉你,做管理.做个管理者.做个官,哪怕是小头目也好. 也许你会说,搞管理还是搞技术,都可以的.比如说,爱立信公司,就有管理.技术两条路线,有些搞技术的工资比管理还要高. 放屁. 大公司,也许吧.但在中小公司,管理者不仅有更高的薪酬,更重要的是,有分配资源的能力.这个资源,除了下属的薪酬福利的决定权.建议权,也可以是负责哪块技术的拍板权.比方说,你是项目经理,你就可以决定谁谁谁去做哪一块,去钻研那块技术.作为项目经理,你完全可以安排那些繁琐.机械

无锡美新赵阳:创业18年,一辈子做好一家企业(创业是一种生活方式;为了赚钱而创业,那是扯淡”。最重要的是做自己喜欢做的事情)

会议室的门开了,赵阳大步迈了进来,带着一身的仆仆风尘——助理说,他才和客户谈好业务便匆匆往回赶——这场景,仿佛和七年前重叠起来. 那年,无锡日报记者采访了创新创业人物.身为美新半导体董事长兼CEO的赵阳;如今,还是在高新区新辉环路2号,还是那个头衔,我们的话题却有了更多的延展性. 一晃,当年北大物理系高才生.后赴美国普林斯顿大学攻读物理和电子工程并师从诺奖得主DanielTsui教授获电子工程博士学位的赵阳,在无锡创业已有18年;他带领的美新,也由零起步成长为全球仅有的同时具备 MEMS传感器和

在亚马逊做店铺的经验谈:少做产品,做精产品才是正道

从2001年开始,除了宣传自己是最大的网络零售商外,亚马逊同时把“最以客户为中心的公司”(the world‘s most customer-centric company)确立为努力的目标.此后,打造以客户为中心的服务型企业成为了亚马逊的发展方向.为此,亚马逊从2001年开始大规模推广第三方开放平台(marketplace).2002年推出网络服务(AWS).2005年推出Prime服务.2007年开始向第三方卖家提供外包物流服务 Fulfillment by Amazon(FBA).2010

做产品还是做技术?

稀里糊涂的进入一家通信公司工作,一直供职于软件平台部门.随着公司发展战略的转变,软件平台部门已经成为鸡肋.作为资源,被各个产品线各种呼来唤去.最后的绩效考核竟然由某一产品线的项目经理说了算,满眼都是累啊. 下一份工作,在产品和技术之间,无论如何也要选择前者.随着年龄的增长,不可能一直做技术.做产品,能够培养一个人的大局观,尤其是做互联网产品,可以为创业打下良好的基础. 目前没有做产品的经验,可以尝试去应聘一些相关的职位.如果不成,可以选择做产品比较牛B的工作先做技术,然后再往产品转.

Spring如何绑定请求参数或PathVariable参数绑定到对象,并做使用@Valid做JSR3

Spring如何绑定请求参数或PathVariable参数绑定到对象,并做使用@Valid做JSR303校验 问题描述 以前在Spring中只对@RequestBody映射的请求参数使用过@Valid做JSR303校验,RequestBody一般适用与Json或者Xml报文,如果是表单提交的参数(a=xxx&b=xxx),或者通过@PathVariable从url映射过来的参数就不懂得怎么做校验了.后来查阅官方文档找到了实现方法. 解决方案 首先这里还是校验那些把请求参数映射成事先定义好的参数对

做自己想做的工作,你也可以

注:这篇文章根据我2015年12月12日在中国黑客联盟和12月17日在CSDN的公开课"做自己想做的工作"整理而来,整理时做了不少调整,与讲课内容大有出入,甚至可以当做一篇新文章来看. 我们大多数人都面临一个严肃的事实:在离开学校后,我们必须在长达40到50年的时间里努力地工作.假如在这么漫长的岁月里,在我们最有精力最有活力的这段人生里,一直做着自己不喜欢的工作(这并不罕见),那就是浪费时间.浪费生命.所以,找到一份适合自己的工作非常重要,只有在做自己想做的工作时,才能获得职业满足,才

游戏引擎网络开发者的 64 做与不做 | Part 1 | 客户端方面

摘要:纵观过去 10 年的游戏领域,单机向网络发展已成为一个非常大的趋势.然而,为游戏添加网络支持的过程中往往存在着大量挑战,这里将为大家揭示游戏引擎网络开发者的 64 个做与不做. [编者按]时下,游戏网络化已势不可逆,因此,对于游戏开发者来说,掌握网络引擎的打造技巧同样不可避免.近日,Research Industrial Systems Engineering GmbH 安全研究员 Sergey Ignatchenko「拥有 20 年以上的工程经验」在 IT Hare 上撰文,深入分享了游