Android之PopupWindow弹出对话框

转载自:http://blog.csdn.net/kkfdsa132/article/details/6376518#
          Android的对话框常用的有两种:PopupWindow和AlertDialog。PopupWindow顾名思义为弹出菜单,不同于AlertDialog对话框,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等

 

下面是运行程序截图:

          Android之PopupWindow弹出对话框_第1张图片    Android之PopupWindow弹出对话框_第2张图片

     

          Android之PopupWindow弹出对话框_第3张图片    Android之PopupWindow弹出对话框_第4张图片

 

      程序代码:

      布局:main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/layout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
	android:id="@+id/tv_showText"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
   	android:gravity="center"
    android:text="@string/hello"
    android:textSize="22px"
    />
    
<Button
	android:id="@+id/bt_PopupWindow1"
	android:text="以自己为Anchor,不偏移"
	android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
	/>  

<Button
	android:id="@+id/bt_PopupWindow2"
	android:text="以自己为Anchor,正下方"
	android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
	/>  
	
<Button
	android:id="@+id/bt_PopupWindow3"
	android:text="以屏幕中心为参照,不偏移(正中间)"
	android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
	/>  

<Button
	android:id="@+id/bt_PopupWindow4"
	android:text="以屏幕下方为参照,下方中间"
	android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
	/>  
	
  
</LinearLayout>


      自定义对话框dialog.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
	android:id="@+id/tv_tip"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="请输入内容:"
    />
  
 <EditText
 	android:id="@+id/et_text"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
 ></EditText> 
 
<LinearLayout
	android:gravity="center_horizontal" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>  
<Button
	android:id="@+id/bt_ok"
	android:text="确定"
	android:layout_width="100px" 
    android:layout_height="50px"
	/>  

<Button
	android:id="@+id/bt_cancle"
	android:text="取消"
	android:layout_width="100px" 
    android:layout_height="50px"
	/>  
</LinearLayout>
</LinearLayout>


     代码:

package com.myandroid.test;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Gallery;
import android.widget.PopupWindow;
import android.widget.TextView;

public class PopupWindowTest extends Activity {//PopupWindow属于不阻塞的对话框,AlertDialog则是阻塞的。
	private Button bt_popupWindow1;
	private Button bt_popupWindow2;
	private Button bt_popupWindow3;
	private Button bt_popupWindow4;
	private TextView tv_showText;
	private PopupWindow popupWindow;
	private int screenWidth;
	private int screenHeight;
	private int dialgoWidth;
	private int dialgoheight;
	

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        initView();
    }
    
    /**
     * 初始化控件和响应事件
     */
    private void initView() {
    	bt_popupWindow1 = (Button)findViewById(R.id.bt_PopupWindow1);
    	bt_popupWindow2 = (Button)findViewById(R.id.bt_PopupWindow2);
    	bt_popupWindow3 = (Button)findViewById(R.id.bt_PopupWindow3);
    	bt_popupWindow4 = (Button)findViewById(R.id.bt_PopupWindow4);
    	tv_showText = (TextView)findViewById(R.id.tv_showText);
    	
    	bt_popupWindow1.setOnClickListener(new ClickEvent());
    	bt_popupWindow2.setOnClickListener(new ClickEvent());
    	bt_popupWindow3.setOnClickListener(new ClickEvent());
    	bt_popupWindow4.setOnClickListener(new ClickEvent());
    	
    	
    	
    }
    
    /**
     * 按钮点击事件处理
     * @author Kobi
     *
     */
    private class ClickEvent implements OnClickListener {
    	
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			switch(v.getId()) {
				
			case R.id.bt_PopupWindow1:	//以自己为Anchor,不偏移
				getPopupWindow();
				popupWindow.showAsDropDown(v);
				break;
				
			case R.id.bt_PopupWindow2:	//以自己为Anchor,偏移(screenWidth-dialgoWidth)/2, 0)--按钮正下方
				getPopupWindow();
				popupWindow.showAsDropDown(v, (screenWidth-dialgoWidth)/2, 0);
				break;
				
			case R.id.bt_PopupWindow3:	//以屏幕中心为参照,不偏移
				getPopupWindow();
				popupWindow.showAtLocation(findViewById(R.id.layout), Gravity.CENTER, 0, 0);
				break;
				
			case R.id.bt_PopupWindow4:	//以屏幕左下角为参照,偏移(screenWidth-dialgoWidth)/2, 0) --屏幕下方中央
				getPopupWindow();
				popupWindow.showAtLocation(findViewById(R.id.layout), 
						Gravity.BOTTOM, 0, 0);
				break;
				
			default:
				break;
			}
		}
    	
    }

    /**
     * 创建PopupWindow
     */
	protected void initPopuptWindow() {
		// TODO Auto-generated method stub
		
		
		View popupWindow_view = getLayoutInflater().inflate(	//获取自定义布局文件dialog.xml的视图
				R.layout.dialog, null,false);
		
		popupWindow = new PopupWindow(popupWindow_view,	200, 150, true);//创建PopupWindow实例
		
		Button bt_ok = (Button)popupWindow_view.findViewById(R.id.bt_ok);	//dialog.xml视图里面的控件
		Button bt_cancle = (Button)popupWindow_view.findViewById(R.id.bt_cancle);
		final EditText et_text = (EditText)popupWindow_view.findViewById(R.id.et_text);	
		
		bt_ok.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				tv_showText.setText(et_text.getText());	//在标签里显示内容
				popupWindow.dismiss();					//对话框消失
			}
		});
		
		bt_cancle.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				popupWindow.dismiss();
			}
		});
		
		//获取屏幕和对话框各自高宽
		screenWidth = PopupWindowTest.this.getWindowManager().getDefaultDisplay().getWidth();
    	screenHeight = PopupWindowTest.this.getWindowManager().getDefaultDisplay().getHeight();

		dialgoWidth = popupWindow.getWidth();
		dialgoheight = popupWindow.getHeight();
		
	}
	
	/*
	 * 获取PopupWindow实例
	 */
	private void getPopupWindow() {
		
		if(null != popupWindow) {
			popupWindow.dismiss();
			return;
		}else {
			initPopuptWindow();
		}
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.e("ActivityState", "onPause");
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.e("ActivityState", "onResume");
	}
	
	

	
}





你可能感兴趣的:(Android之PopupWindow弹出对话框)