天天看点

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

           打开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,如图所示:

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

         点击右上角的菜单,弹出菜单项,好,我们来实现这个效果。

         第一步、设计菜单页面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" />