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等 |
下面是运行程序截图:
程序代码:
布局: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");
- }
- }