Android学习之-----PopupWindow

Android的对话框有两种:PopupWindow和AlertDialog。
详细说明如下:
AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;
AlertDialog的位置固定,而PopupWindow的位置可以随意;
AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;
PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。
PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件;
PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞。

一.总结:

PopupWindow的基本用法,如下:

1、为PopupWindow的view布局,通过LayoutInflator获取布局的view.如:

1 LayoutInflaterinflater=(LayoutInflater)this.anchor.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

2 ViewtextEntry View=inflater.inflate(R.layout.paopao_alert_dialog,null);

2、显示位置,可以有很多方式设置显示方式

1 pop.showAtLocation(findViewById(R.id.ll2),Gravity.LEFT,0,-90);

3、进出场动画

1 pop.setAnimationStyle(R.style.PopupAnimation);

4、点击PopupWindow区域外部,PopupWindow消失

 1  this.window=newPopupWindow(anchor.getContext());
 2
 3      this.window.setTouchInterceptor(newOnTouchListener(){
 4
 5 @Override
 6
 7 publicbooleanonTouch(Viewv,MotionEventevent){
 8
 9     if(event.getAction()==MotionEvent.ACTION_OUTSIDE){
10
11     BetterPopupWindow.this.window.dismiss();
12
13     return  true;
14
15 }
16
17 return  false;
18
19 }
20
21 });

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

newPopupWindow(view,ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);

2、popuWindow.showAsDropDown(v);方法是将PopuWindow显示在Viewv的左下方;

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

ColorDrawablecd=newColorDrawable(-0000);

popuWindow.setBackgroundDrawable(cd);

popuWindow.showAsDropDown(v);

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

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

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

popuWindow.setOutsideTouchable(true);

二.实例代码:

XML:

1.activity_main页面:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:gravity="center_horizontal"
 6     android:orientation="vertical" >
 7
 8     <Button
 9         android:id="@+id/btn"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:text="弹出泡泡窗口" />
13
14 </LinearLayout>

2.popup页面:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:gravity="center_horizontal"
 6     android:orientation="vertical" >
 7
 8     <ImageView
 9         android:layout_width="240dp"
10         android:layout_height="wrap_content"
11         android:src="@drawable/img" />
12
13     <Button
14         android:id="@+id/close"
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content"
17         android:text="关闭" />
18
19 </LinearLayout>

3.java代码:

 1 package com.example.popupwindow;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.Gravity;
 6 import android.view.View;
 7 import android.view.View.OnClickListener;
 8 import android.widget.Button;
 9 import android.widget.PopupWindow;
10
11 public class MainActivity extends Activity {
12
13     private Button btn;
14     private Button btnClose;
15     private View inflaterView;
16
17     @Override
18     public void onCreate(Bundle savedInstanceState) {
19         super.onCreate(savedInstanceState);
20         setContentView(R.layout.activity_main);
21
22         initView();
23
24     }
25
26     private void initView() {
27         // 装载R.layout.popup对应的界面布局
28         inflaterView = this.getLayoutInflater().inflate(R.layout.popup, null);
29         btnClose = (Button) inflaterView.findViewById(R.id.close);
30         btn = (Button) this.findViewById(R.id.btn);
31
32         final PopupWindow popupWindow = new PopupWindow(inflaterView, 300, 400);
33         btn.setOnClickListener(new OnClickListener() {
34             @Override
35             public void onClick(View arg0) {
36                 popupWindow.showAtLocation(btn, Gravity.CENTER, 20, 20);
37
38             }
39         });
40
41         btnClose.setOnClickListener(new OnClickListener() {
42             @Override
43             public void onClick(View arg0) {
44                 popupWindow.dismiss(); // 关闭窗口
45             }
46         });
47     }
48 }
时间: 2024-10-25 22:34:20

Android学习之-----PopupWindow的相关文章

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司.Notification通知.PopupWindow弹出窗 Toast吐司 Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式: 第一种,默认显示方式,也是最常用的方式: Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LE

Android学习系列(40)--Android主题和样式之系统篇(下)

Widget样式(Widget Style) 特别说明,此处定义大量的系统内置控件的样式,对于重写原生控件的样式具有很大的参考价值. <!-- Widget styles --> <item name="absListViewStyle">@android:style/Widget.AbsListView</item> <item name="autoCompleteTextViewStyle">@android:st

Android 学习资料分享(2015 版)

我是如何自学Android,资料分享(2015 版) Tikitoo2015.02.11 10:21 1713 字 3932 次阅读 自己学了两三个月的Android,最近花了一周左右的时间写了个App--Diigoer(已开源),又花了一两周时间找工作,收到了两个Offer,也算是对自己学习的一种认可吧:我刚开始学习总结的--<我是如何自学Android,资料分享>,如果是初学Android 的话,不应该错过的,而今天这篇分享好这篇文章,相对于第一次写的会有所提升,所以建议先把上一篇看了,再

android学习路线:如何成长为高级工程师

博主参加了2014 CSDN博客之星评选,帮我投一票吧.点击给我投票前言之所以写这篇文章,是因为最近博客和我的开发群( 215680213 )中,不少小伙伴都让我讲讲android学习路线,所以我决定写一篇博客,来说明这个问题.既然有不少小伙伴来咨询这个问题,说明大家都还是想快速地提高技术,毕竟技术的提高是职业发展中不可或缺的一步,技术好了,才能得到认可,才能升职加薪.一般来说,快速提高技术是不太容易的,但是通过正确的方法加上辛勤的汗水是可以缩短这个过程的.或许有人会问,你凭什么来写这个学习路线

Android学习系列(17)--App列表之圆角ListView(续)

http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)--App列表之圆角ListView中的,但是若是如此就让大家错过一篇新的好的文章,着实可惜.上篇中我们使用shape,corners,gradient实现了一个渐变的圆角效果,但是在完文之后的实践中,我发现有时效果不甚满意,选中和放手的事件监听没有去正确的判断,然后渐变效果也比较单一,性能也觉得不是很快

Android学习笔记——关于onConfigurationChanged

从事Android开发,免不了会在应用里嵌入一些广告SDK,在嵌入了众多SDK后,发现几乎每个要求在AndroidManifest.xml申明Activity的广告SDK都会要求加上注明这么一句属性: android:configChanges="orientation|keyboard|keyboardHidden" 通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChan

Android学习笔记18:自定义Seekbar拖动条式样

Android学习笔记18:自定义Seekbar拖动条式样

问题:android学习内容破碎,我个人关于如何学习android的一些个人经历

android学习两个月心得 我于大三下学期,开始准备学习android,在寒假期间,学了毕向东的java视频的前10天,觉得还不错,上网找评论,他们都说,只要学到多线程就可以学习android了, 开学我就开始了android的学习,做了一些简单的UI,实现了几个简单Activity的信息传递和跳转.但是在学习的过程中我发现(到目前为止,大概两个月),android的知识点就像是一片又一片的花瓣,你可以任意挑选这去学习,没有一个权威的方向. 各种视频教程,图书,包括android的官方开发文档

Android 学习笔记 2 Android开发环境的安装(Eclipse Bundle)

搭建eclipse开发环境,一般要经过 安装JDK.安装Eclipse.下载Android SDK.在Eclipse中安装ADT.在Eclipse中配置Android SDK.通过SDK Manager对Android SDK进行管理等几个比较麻烦的步骤. 后来Google推出了 adt-bundle 将ATD.SDK整合到Eclipse中,这样对于新手来说就免去了很多步骤,入门更容易了. 在此推荐一个网站 http://tools.android-studio.org/ 可以免去搬梯子去And