标签:android windowmanager popupwindow 自定义menu
打开PopupWindow的源码,你会发现它其实也是通过WindowManager来添加view的。
private void invokePopup(WindowManager.LayoutParams p) { if (mContext != null) { p.packageName = mContext.getPackageName(); } mPopupView.setFitsSystemWindows(mLayoutInsetDecor); setLayoutDirectionFromAnchor(); mWindowManager.addView(mPopupView, p); }
点击右上角的菜单,弹出菜单项,好,我们来实现这个效果。
第一步、设计菜单页面layout_menu.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="156dp" android:layout_height="150dp" android:background="#9AFF9A" android:orientation="vertical" > <LinearLayout android:id="@+id/layout_share" android:layout_width="match_parent" android:layout_height="49dp" android:background="@drawable/item_bg_style" android:clickable="true" android:orientation="horizontal" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:src="@drawable/ic_share" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="@string/lbl_share" android:textColor="#187D18" > </TextView> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="#87EC87" > </LinearLayout> <LinearLayout android:id="@+id/layout_setting" android:layout_width="match_parent" android:layout_height="49dp" android:background="@drawable/item_bg_style" android:clickable="true" android:orientation="horizontal" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:src="@drawable/ic_setting" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="@string/lbl_setting" android:textColor="#187D18" > </TextView> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="#87EC87" > </LinearLayout> <LinearLayout android:id="@+id/layout_update" android:layout_width="match_parent" android:layout_height="49dp" android:background="@drawable/item_bg_style" android:clickable="true" android:orientation="horizontal" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:src="@drawable/ic_update" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="@string/lbl_update" android:textColor="#187D18" > </TextView> </LinearLayout> </LinearLayout>
View popView = getLayoutInflater().inflate(R.layout.layout_menu, null); LinearLayout layoutShare = (LinearLayout) popView.findViewById(R.id.layout_share); layoutShare.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); LinearLayout layoutSetting = (LinearLayout) popView.findViewById(R.id.layout_setting); layoutSetting.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this, SettingActivity.class)); if (popup!=null&&popup.isShowing()) { popup.dismiss(); } } }); LinearLayout layoutUpdate = (LinearLayout) popView.findViewById(R.id.layout_update); layoutUpdate.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); PobupWindow popup = new PopupWindow(popView, UIUtils.dip2px(MainActivity.this, 156), UIUtils.dip2px(MainActivity.this, 150)); popup.setFocusable(true); popup.setOutsideTouchable(true); popup.setBackgroundDrawable(new BitmapDrawable()); layoutMenuContainer = (LinearLayout) findViewById(R.id.layout_menu); layoutMenuContainer.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { int[] location = new int[2]; v.getLocationOnScreen(location); if (popup.isShowing()) { popup.dismiss(); } else { // popup.showAsDropDown(v); popup.showAsDropDown(v, -UIUtils.dip2px(MainActivity.this, 129), 0); // popup.showAtLocation(v, // Gravity.NO_GRAVITY,location[0]-UIUtils.dip2px(MainActivity.this,100),location[1]+UIUtils.dip2px(MainActivity.this,60)); } } catch (Exception e) { if (e != null) { e.printStackTrace(); } } } });
第三步、AndroidManifest.xml配置权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
android开发步步为营之64:PopupWindow实现自定义弹出菜单
标签:android windowmanager popupwindow 自定义menu
原文地址:http://blog.csdn.net/figo0423/article/details/46640359