`
TonySun3544
  • 浏览: 161298 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android中popupwindow的点滴

阅读更多

 

java类:

package com.tony.PopupWindow;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class PopupWindowActivity extends Activity {

	private static final String TAG = "PopupWindowActivity";

	private List<Map<String, String>> list = new ArrayList<Map<String, String>>();

	private int state;
	private Button myButton;
	private ListView menulist;
	private View layout;
	private PopupWindow pop;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		HashMap<String, String> map1 = new HashMap<String, String>();
		map1.put("menuItemName", "系统设置");
		list.add(map1);
		HashMap<String, String> map2 = new HashMap<String, String>();
		map2.put("menuItemName", "自助更新");
		list.add(map2);
		HashMap<String, String> map3 = new HashMap<String, String>();
		map3.put("menuItemName", "关于");
		list.add(map3);
		HashMap<String, String> map4 = new HashMap<String, String>();
		map4.put("menuItemName", "搜索");
		list.add(map4);
		HashMap<String, String> map5 = new HashMap<String, String>();
		map5.put("menuItemName", "退出");
		list.add(map5);

		myButton = (Button) findViewById(R.id.button);

		myButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				if (state == 1 && pop.isShowing()) {
					state = 0;
					pop.dismiss();
				} else {
					/***	弹出自定义的菜单		***/
					layout = getLayoutInflater().inflate(R.layout.menu_layout,
							null);
					menulist = (ListView) layout.findViewById(R.id.menulist);
					SimpleAdapter listAdapter = new SimpleAdapter(
							PopupWindowActivity.this, list, R.layout.menu_item,
							new String[] { "menuItemName" },
							new int[] { R.id.menuitem });
					menulist.setAdapter(listAdapter);

					/**
					 * layout							PopupWindow所显示的界面	
					 * myButton.getWidth()				设置PopupWindow宽度
					 * myButton.getHeight() * 3 + 5		设置PopupWindow宽度高度
					 */
					pop = new PopupWindow(
							layout,
							myButton.getWidth(),
							myButton.getHeight() * 3 + 5);

					ColorDrawable cd = new ColorDrawable(-0000);
					pop.setBackgroundDrawable(cd);
					// pop.showAsDropDown(v);

					pop.update();
					pop.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
					pop.setTouchable(true);	// 设置popupwindow可点击
					pop.setOutsideTouchable(true);	// 设置popupwindow外部可点击
					pop.setFocusable(true);	//获取焦点
					/*设置popupwindow的位置*/
					pop.showAtLocation(layout,
							(Gravity.BOTTOM - myButton.getHeight())
									| Gravity.LEFT, 0, 2 * myButton.getHeight());
					state = 1;
					pop.setTouchInterceptor(new View.OnTouchListener() {
						@Override
						public boolean onTouch(View v, MotionEvent event) {
							/****	如果点击了popupwindow的外部,popupwindow也会消失	****/
							if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
								pop.dismiss();
								return true; 
							}
							return false;
						}

					});
					/****	点击listview中item的处理	****/
					menulist.setOnItemClickListener(new OnItemClickListener() {

						@Override
						public void onItemClick(AdapterView<?> arg0, View arg1,
								int arg2, long arg3) {
							switch (arg2) {
							case 0:
								Toast.makeText(getApplicationContext(), "系统设置",
										Toast.LENGTH_SHORT).show();
								pop.dismiss();
								break;
							case 1:
								Toast.makeText(getApplicationContext(), "自动更新",
										Toast.LENGTH_SHORT).show();
								pop.dismiss();
								break;
							case 2:
								Toast.makeText(getApplicationContext(), "关于",
										Toast.LENGTH_SHORT).show();
								pop.dismiss();
								break;
							case 3:
								Toast.makeText(getApplicationContext(), "搜索",
										Toast.LENGTH_SHORT).show();
								pop.dismiss();
								break;
							case 4:
								Toast.makeText(getApplicationContext(), "退出",
										Toast.LENGTH_SHORT).show();
								pop.dismiss();
								break;
							}
						}
					});
				}
			}
		});
	}
}

 

布局文件:

main.xml

<?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="fill_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="100dp "
        android:layout_height="wrap_content"
        android:id="@+id/button"
        android:text="菜单" />

</LinearLayout>

 

 menu_layout.xml

<?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="wrap_content"
    android:background="@drawable/a2" 
    >

    <ListView
        android:id="@+id/menulist"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

 

 menu_item.xml

 

<?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="wrap_content" >

    <TextView
        android:id="@+id/menuitem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:textColor="#FFFFFF"
        android:textSize="20sp" />

</LinearLayout>

 

 

下面是运行的结果:

 

 

 

点击popupwindow会有相应的处理,点击返回键或者是popupwindow外部的区域popupwindow也会消失,这也是很多人想要的效果。

 

 

 

需要强调的一些事儿:

1.PopuWindow 的大小由下面代码控制;

new PopupWindow(view, ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);

 

 2.需要顺利让PopUpWindow dimiss(即点击PopuWindow之外的地方此或者backPopuWindow会消失);PopUpWindow的背景不能为空。必须在popuWindow.showAsDropDown(v);或者其它的显示PopuWindow方法之前设置它的背景不为空:如下面两行代码:

ColorDrawablecd = new ColorDrawable(-0000);
popu.setBackgroundDrawable(cd);

注意这里设置背景并不会覆盖xml文件定义的背景。

 

 3.当有popuWindow.setFocusable(false);的时候,说明PopuWindow不能获得焦点,即使设置设置了背景不为空也不能点击外面消失,只能由dismiss()消失,但是外面的View的事件还是可以触发,back键也可以顺利dismiss掉。当设置为popuWindow.setFocusable(true);的时候,加上下面两行设置背景代码,点击外面和Back键才会消失。

ColorDrawable cd = new ColorDrawable(-0000);
pop.setBackgroundDrawable(cd);

 

 4.这里设置显示PopuWindow之后在外面点击是否有效。如果为false的话,那么点击PopuWindow外面并不会关闭PopuWindow。当然这里很明显只能在Touchable下才能使用。

 

ColorDrawable cd = new ColorDrawable(-0000);
pop.setBackgroundDrawable(cd);

 

 

分享到:
评论
1 楼 imesong 2013-01-14  
谢谢分享,解决了我的问题~~

相关推荐

    android popupwindow 底部灰色背景

    在Android开发中,PopupWindow是一个非常实用的组件,它允许我们创建浮动窗口,可以在Activity的任何位置显示。在实现特定的UI设计时,比如底部弹出菜单或对话框,我们可能会遇到需要添加底部灰色背景的需求。这个...

    Android 多级PopupWindow的小demo.zip

    在Android中创建一个PopupWindow需要以下步骤: 1. **创建PopupWindow对象**:通过`new PopupWindow(view, width, height, flag)`初始化,其中view是你要展示的布局,width和height是PopupWindow的尺寸,flag可以...

    android:PopupWindow的使用

    在Android开发中,`PopupWindow`是一个非常实用的组件,它允许我们创建浮动、弹出式的视图,常用于下拉菜单、浮层提示等场景。`PopupWindow`提供了丰富的自定义选项,使得开发者可以轻松地调整其外观和行为。在本篇...

    android的popupWindow使用

    在Android开发中,PopupWindow是一个非常实用的组件,它能够帮助开发者实现类似气泡提示、下拉菜单等弹出窗口效果。本篇文章将详细介绍如何在Android应用中使用PopupWindow,并通过一个具体的案例来演示其基本用法。...

    android自定义通用PopupWindow

    在Android开发中,`PopupWindow` 是一个非常实用的组件,它允许我们创建弹出式窗口,用于显示一些临时信息或者交互操作。本教程将详细讲解如何封装一个通用的`PopupWindow`,以便在项目中复用,降低代码冗余,提高...

    Android PopupWindow与Activity之间的数据传递.zip

    下面将详细阐述如何在Android中进行PopupWindow与Activity的数据传递。 首先,理解PopupWindow的基本概念。PopupWindow是Android SDK提供的一种轻量级弹出窗口,它可以显示在屏幕任意位置,并且可以设置背景透明度...

    Android从屏幕底部弹出PopupWindow

    在Android开发中,PopupWindow是一种常用的UI组件,它可以在屏幕上的任意位置显示一个浮动窗口,通常用于实现类似下拉菜单、提示框等效果。在这个场景中,我们要实现的是从屏幕底部弹出的PopupWindow,并带有滑动...

    android 之popupWindow的使用

    在博客《Android中popWindow弹出菜单的编写》中,作者可能详细介绍了如何创建一个包含菜单项的PopupWindow,以及如何响应用户的点击事件。通过结合实际案例,你可以更深入地理解PopupWindow的用法和应用场景。 总的...

    android使用popupwindow自定义menu菜单

    本篇将详细介绍如何在Android中利用`PopupWindow`来实现自定义的menu菜单。 首先,我们需要了解`PopupWindow`的基本用法。`PopupWindow`类提供了创建和管理浮动窗口的功能。它可以在任意视图上方显示,可以设置大小...

    android自定义popupwindow仿微信

    在Android开发中,自定义PopupWindow是一种常见的交互方式,它能提供类似对话框的效果,但比对话框更灵活,可以自由地控制显示位置和样式。本篇内容将深入讲解如何模仿微信的PopupWindow实现,以增强应用的用户体验...

    Android PopupWindow泡泡效果(有listview)

    ListView是Android中的列表视图组件,可以用来展示大量的数据并支持滚动。在这个布局中,我们还需要为ListView指定一个适配器,适配器负责将数据转化为ListView中的项。常见的适配器有ArrayAdapter、BaseAdapter等,...

    android自定义popupwindow仿微信右上角弹出菜单效果

    在Android开发中,`PopupWindow` 是一个非常实用的组件,它可以用来创建各种弹出式菜单或对话框。本文将详细介绍如何使用`PopupWindow`在Android应用中模仿微信右上角的弹出菜单效果。 首先,我们需要理解`...

    Android用PopupWindow实现弹出listview形式菜单

    在Android开发中,有时我们需要创建一个可自定义的弹出菜单,这通常通过使用`PopupWindow`类来实现。`PopupWindow`是Android系统提供的一个轻量级窗口,它可以显示在屏幕上的任意位置,用于创建浮动、弹出式的UI组件...

    android自定义PopupWindow

    在Android开发中,`PopupWindow` 是一个非常实用的组件,它允许我们在界面中弹出一个浮动窗口,常用于创建下拉菜单、提示信息或模拟对话框等效果。本篇文章将详细探讨如何自定义 `PopupWindow` 实现类似微信弹框类别...

    Android中PopupWindow的基本使用

    在Android开发中,`PopupWindow`是一个非常实用的组件,它允许我们创建浮动窗口,可以在屏幕上任意位置显示,常用于下拉菜单、提示信息、快捷操作等场景。本篇文章将详细探讨`PopupWindow`的基本使用方法及其核心...

    Android TV 开发有关PopupWindow的KeyListener

    在Android TV开发中,PopupWindow是一个非常重要的组件,它允许我们创建浮动的窗口,可以用来显示额外的信息或者提供用户交互。PopupWindow与普通手机应用中的用法类似,但在Android TV环境中,由于大屏幕和遥控器...

    Android自定义PopupWindow日历 日期时间选择器 可自由搭配年月日时分显示

    在Android开发中,自定义组件是提升应用用户体验和界面独特性的重要手段。本文将深入探讨如何创建一个可自定义的`PopupWindow`日历日期时间选择器,它允许用户根据需求自由选择显示年、月、日、时和分。这个组件在很...

    Android PopupWindow实现右侧、左侧和底部弹出菜单

    PopupWindow是Android中的一个类,它允许开发者创建浮动的窗口,可以显示在任何视图之上。它通常用于创建快速操作菜单、提示信息等。PopupWindow的特性包括大小可变、背景可透明、支持动画效果等,这使得它成为设计...

    Android: PopupWindow 上显示 ListView 并相应 Demo

    在Android开发中,有时我们需要创建一个浮动窗口来展示一些临时信息或者交互,PopupWindow就是这样的一个组件。本示例将详细介绍如何在PopupWindow上显示一个ListView,并实现与之相关的交互功能,模仿QQ登录界面,...

Global site tag (gtag.js) - Google Analytics