打开PopupWindow的源码,你会发现它其实也是通过WindowManager来添加view的。
private void invokePopup(WindowManager.LayoutParams p) {
if (mContext != null) {
p.packageName = mContext.getPackageName();
}
mPopupView.setFitsSystemWindows(mLayoutInsetDecor);
setLayoutDirectionFromAnchor();
mWindowManager.addView(mPopupView, p);
}
本文实现的效果就是通过PopupWindow弹出一个自定义menu,如图所示:
点击右上角的菜单,弹出菜单项,好,我们来实现这个效果。
第一步、设计菜单页面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" />