首页 > 代码库 > Android学习之-----PopupWindow

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     <Button14         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     @Override18     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             @Override35             public void onClick(View arg0) {36                 popupWindow.showAtLocation(btn, Gravity.CENTER, 20, 20);37 38             }39         });40 41         btnClose.setOnClickListener(new OnClickListener() {42             @Override43             public void onClick(View arg0) {44                 popupWindow.dismiss(); // 关闭窗口45             }46         });47     }48 }

 

Android学习之-----PopupWindow