您的位置:首页 > 移动开发 > Android开发

android开发步步为营之64:PopupWindow实现自定义弹出菜单

2015-06-25 20:23 791 查看
打开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" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: