首页 > 代码库 > Android中popWindow弹出菜单的编写

Android中popWindow弹出菜单的编写

1、什么是popWindow?

popWindow就是对话框的一种方式!此文讲解的android中对话框的一种使用方式,它叫popWindow。

2、popWindow的特性

Android的对话框有两种:PopupWindow和AlertDialog。它们的不同点在于:
AlertDialog的位置固定,而PopupWindow的位置可以随意。
AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的。
PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移

3、popWindow的设计

效果图:



实现这个效果的,总共有两个三个xml布局,一个是工具栏布局,一个是popWindow布局,一个是父界面布局。

工具栏布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="@dimen/chat_llyt_title_height"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:background="@color/black"
    android:orientation="horizontal" >
    
    <ImageView
        android:id="@+id/app_iv_back"
        android:layout_width="@dimen/chat_llyt_title_height"
        android:layout_height="fill_parent"
        android:background="@drawable/actionbar_bg_left"
        android:layout_gravity="center"
        android:padding="7dip"
        android:scaleType="centerInside"
         />

    <TextView
        android:id="@+id/app_tv_barname"
        android:layout_width="0.0dip"
        android:layout_height="fill_parent"
        android:layout_weight="4.0"
        android:background="@drawable/actionbar_bg_middle"
        android:gravity="center"
        android:text="@string/app_name"
        android:textColor="@color/white"
        android:textSize="@dimen/wc_title_textsize" />

    <ImageView
        android:id="@+id/app_iv_search"
        android:layout_width="@dimen/chat_llyt_title_height"
        android:layout_height="fill_parent"
        android:background="@drawable/actionbar_bg_right"
        android:padding="7dip"
        android:layout_gravity="center"
        android:scaleType="centerInside"
        android:src=http://www.mamicode.com/"@drawable/yuyou_bg_pop" />>
popWindow布局:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rlyt_menu"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="9" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:orientation="vertical" >

        <View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0.05" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="2.3"
            android:background="@drawable/yuyou_pop_menu"
            android:orientation="vertical" >

            <View
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="0.1" />

            <LinearLayout
                android:id="@+id/rlyt_code"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:orientation="vertical" >

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:contentDescription="@drawable/face_code_bg"
                    android:paddingLeft="10dp"
                    android:paddingRight="10dp"
                    android:src=http://www.mamicode.com/"@drawable/face_code_bg">
父界面布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="@dimen/chat_llyt_title_height"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:background="@color/black"
    android:orientation="horizontal" >
    
    <ImageView
        android:id="@+id/app_iv_back"
        android:layout_width="@dimen/chat_llyt_title_height"
        android:layout_height="fill_parent"
        android:background="@drawable/actionbar_bg_left"
        android:layout_gravity="center"
        android:padding="7dip"
        android:scaleType="centerInside"
         />

    <TextView
        android:id="@+id/app_tv_barname"
        android:layout_width="0.0dip"
        android:layout_height="fill_parent"
        android:layout_weight="4.0"
        android:background="@drawable/actionbar_bg_middle"
        android:gravity="center"
        android:text="@string/app_name"
        android:textColor="@color/white"
        android:textSize="@dimen/wc_title_textsize" />

    <ImageView
        android:id="@+id/app_iv_search"
        android:layout_width="@dimen/chat_llyt_title_height"
        android:layout_height="fill_parent"
        android:background="@drawable/actionbar_bg_right"
        android:padding="7dip"
        android:layout_gravity="center"
        android:scaleType="centerInside"
        android:src=http://www.mamicode.com/"@drawable/yuyou_bg_pop" />>对话框类,继承OnClickListener,对点击事件的相应:

package com.example.popwindow;

import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.PopupWindow;

public class MySimplePopMenu implements OnClickListener {
	private final PopupWindow popupWindow;
	private Activity mParent;

	public MySimplePopMenu(Activity mParent, int hight) {
		this.mParent = mParent;
		View menu = initMenuView(mParent);
		popupWindow = new PopupWindow(menu);
		popupWindow.setWidth(LayoutParams.MATCH_PARENT);
		popupWindow.setHeight(hight);
		popupWindow.setAnimationStyle(R.style.PopAnimation);
	}

	/**
	 * 设置具体Menu按钮的监听
	 * 
	 * @param mParent
	 * @return
	 */
	private View initMenuView(Activity mParent) {
		View menuView = mParent.getLayoutInflater().inflate(
				R.layout.my_simple_popupwindow_menu, null);
		menuView.findViewById(R.id.rlyt_menu).setOnClickListener(this);
		menuView.findViewById(R.id.rlyt_code).setOnClickListener(this);
		menuView.findViewById(R.id.rlyt_his).setOnClickListener(this);
		return menuView;
	}

	@Override
	public void onClick(View view) {
		switch (view.getId()) {
		// 点击空白处
		case R.id.rlyt_menu:
			if (popupWindow != null && popupWindow.isShowing()) {
				popupWindow.dismiss();
			}
			break;

		// 扫一扫
		case R.id.rlyt_code:
			break;

		// 历史记录
		case R.id.rlyt_his:
			break;
		}
	}

	/**
	 * 返回View
	 * 
	 * @return
	 */
	public PopupWindow getMenu() {
		return popupWindow;
	}
}


这段代码中的popupWindow.setAnimationStyle(R.style.PopAnimation);这行代码需要特别注意,作用于对话框的弹出效果,如何使用可关注的我的博文:http://blog.csdn.net/stoppig/article/details/21481057。使用原理是差不多的。


主activity代码:

package com.example.popwindow;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

	private MySimplePopMenu popMenu;// 弹出选择框
	private PopupWindow mPopupWindow; // 弹出框
	private ImageView app_iv_search;
	private boolean mIsFirst = true; // 是否第一次初始化弹出框
	private Context mContext;
	private RelativeLayout mLayout;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViews();
		initListener();
		this.mContext = this;
	}

	private void findViews() {
		app_iv_search = (ImageView) findViewById(R.id.app_iv_search);
		mLayout = (RelativeLayout) findViewById(R.id.rv_main);
	}

	private void initListener() {
		app_iv_search.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (mIsFirst) {
					mIsFirst = false;
					int height = mLayout.getHeight() - v.getHeight();
					popMenu = new MySimplePopMenu(MainActivity.this, height);
					mPopupWindow = popMenu.getMenu();
				}

				if (mPopupWindow == null) {
					return;
				}

				if (mPopupWindow.isShowing()) {
					mPopupWindow.dismiss();
					return;
				}

				mPopupWindow.showAtLocation(mLayout, Gravity.BOTTOM, 0, 0);
			}
		});
	}

	/**
	 * 获取屏幕高度
	 * 
	 * @param context
	 * @return
	 */
	private int getScreenHeight(Context context) {
		WindowManager manager = (WindowManager) context
				.getSystemService(Context.WINDOW_SERVICE);
		Display display = manager.getDefaultDisplay();
		return display.getHeight();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

ps:这段代码mIsFirst这个属性是特别注意的,这个属性控制着对话框弹出的次数,如果没有进行控制,每点一次就会弹出一次。


主要代码就这样差不多了。资源地址请点击:下载资源。