弹出窗 的几种 PopupWindow

转载

首先我们先达成一个共识:Dialog、PopUpWindow、Toast等都属于子窗口,子窗口必须依附在父窗口上

1.toast 没有任何交互的 提示窗

 它永远不会获得焦点,无法被点击,

2.dialog   

https://blog.csdn.net/eclothy/article/details/39340657

dialog没法设置宽为整个屏幕宽, 总是有点边界,

设置dialog的位置和大小与加载布局文件无关。 需要自己设置dialog参数。

1).设置Dialog位置:

设置位置时必须先指定Dialog的gravity属性, 否则指定大小无用。

2).去标题

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);<span style="color:#cc0000;">

//要在创建完dialog后就调用,否则报错


3).设置Dialog的宽和高(设置dialog的位置,宽高)

WindowManager wm = getWindowManager();

Display display = wm.getDefaultDisplay();

android.view.WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();

lp.width = display.getWidth();

lp.height =LayoutParams.WRAP_CONTENT;

dialog.getWindow().setAttributes(lp);

4).设置动画

设置Dialog的动画只能通过设置xml的形式,然后设置在style中,最后在代码中设置。 

代码步骤:

           第一步:写动画xml window_in.xml: window_out.xml:

           第二步:动画配置到style中

           第三步:将动画用于dialog中 Window window = dialog.getWindow();

          //设置显示动画

          window.setWindowAnimations(R.style.main_menu_animstyle);

          WindowManager.LayoutParams wl = window.getAttributes();

          wl.x = 0;

          wl.y = getWindowManager().getDefaultDisplay().getHeight(); //设置显示位置

         dialog.onWindowAttributesChanged(wl);

         //设置点击外围解散

        dialog.setCanceledOnTouchOutside(true);

        dialog.show();

 

另外在show方法里主要通过WindowManager的addView方法添加Dialog窗口。

 

3.   PopupWindow 

PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。

https://www.cnblogs.com/mengdd/p/3569127.html

1)设置显示位置特别方便:

showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移。

showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移。

showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移。 

AlertDialog和Popupwindow的区别:
1)AlertDialog是非阻塞线程的,Popupwindow是阻塞线程的。
2)Dialog没法设置宽为整个屏幕宽,总有点边界。Popupwindow可以。

 

4.alterDialog 

是一个弹窗的对话框 ,

AlertDialog继承自Dialog类,对于Android内置的AlterDialog,它可以包含一个标题、一个内容消息或者一个选择列表、最多三个按钮。而创建AlterDialog推荐使用它的一个内部类AlterDialog.Builder创 建。使用Builder对象,可以设置AlterDialog的各种属性,最后通过Builder.create()就可以得到AlterDialog对 象,如果只是还需要显示这个AlterDialog,一般可以直接使用Builder.show()方法,它会返回一个AlterDialog对象,并且 显示它。

 

AlterDialog 常用的样式    https://blog.csdn.net/u013771273/article/details/47002309

AlterDialog和popupWindw的区别:

1 第一个重要的区别是AlertDialog不能指定显示位置,只能默认显示在   屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。   而PopupWindow是可以指定显示位置的,随便哪个位置都可以,更加灵活。

2 AlertDialog是非阻塞线程式对话框:

AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞线程式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后, PopupWindow退出,程序才会向下执行。

这两种区别的表现是:   AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,   证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,   这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,   背景没有什么变化,但是当我们点击背景的时候,程序没有响应,   只允许我们操作PopupWindow,其他操作被阻塞。

3 PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物   的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件

//------------------------------------------------------------------------------------------------

注意:

dialog,alertDialog ,button等样式,会受到该activity(或application)中的theme 影响,在不同的theme下,dialog的样式也是不同的,如,在android.Theme.Light和 =@android:style/Theme.Holo.Light下,dialog呈现不同的背景色和不同的PositiveButton

按钮样式, 虽然在Builder中alterDialog.Theme_traditional 也能改,但是二者改变后的效果还是有差别的。

APP在Android中的界面展示从上到下的情况:

状态栏--titleBar(apk名)--ActionBar/ToolBar--ActivityView,所以theme若是Theme.Light.NoTitleBar则去除apk名称那一条,而Theme.Light.NoTitleBar.FullScreen则是连状态栏也消失的展示;

Android系统自带样式(android:theme):

Theme.Dialog : Activity显示为对话框模式
Theme.NoTitleBar : 不显示应'A8程序标题栏
Theme.NoTitleBar.Fullscreen : 不显示应用程序标题栏,并全屏
Theme.Light :背景为白色
Theme.Light.NoTitleBar : 白色背景并无标题栏
Theme.Light.NoTitleBar.Fullscreen : 白色背景,无标题栏,全屏
Theme.Black : 背景黑色
Theme.Black.NoTitleBar : 黑色背景并无标题栏
Theme.Black.NoTitleBar.Fullscreen : 黑色背景,无标题栏,全屏
Theme.Wallpaper : 用系统桌面为应用程序背景
Theme.Wallpaper.NoTitleBar : 用系统桌面为应用程序背景,且无标题栏
Theme.Wallpaper.NoTitleBar.Fullscreen : 用系统桌面为应用程序背景,无标题栏,全屏
Theme.Translucent : 透明背景
Theme.Translucent.NoTitleBar : 透明色背景并无标题
Theme.Translucent.NoTitleBar.Fullscreen : 透明背景并无梇题,全屏
Theme.Panel : 面板风格显示
Theme.Light.Panel : 平板风格显示
android4.0之后出来的holo:
Theme Holo全屏显示样式,默认是黑背景,
Theme_Holo_Dialog 将activity显示成对话框的样式
Theme_Holo_Dialog_MinWidth 将activkty显示成对话框的样式,显示最小状'80�时,
Theme_Holo_DialogWhenLarge 将activity显示成对话框的样式,显示最大状态Theme_Holo_DialogWhenLarge_NoActionBar 将activity显示成对话框的样式,且没有action bar
Theme_Holo_Dialog_NoActionBar 将activity显示成对话框的样式,且没有action bar,默认状态
Theme_Holo_Dialog_NoActionBar_MinWidth 将activity显示成对话框的样式,且没有action bar,显示最小状怃时
Theme_Holo_NoActionBar 默认�%:A�态下,没有action bar的样式。
Theme_Holo_NoActionBar_Fullscreen 默��状态下,没有action bar且全屏的样式
Theme_Holo_Wallpaper 使用墙纸做为样式背景,默认状态下
Theme_Holo_Wallpaper_NoActionBar 使用墙纸做为样式背景,且没有action bar。
Theme_Holo_Panel 默认将一%G4��activity显示成一个对话框样式,区别于�Ϲ话框,这个没有外边框,没有任何样式元素只有一渪空的矩形框。
Theme_Holo_Light 默认样式,区别于黓背景,这个属于亮背景Theme_Holo_Light_Dialog 默��将一个activity显示成一个对话框样式,区别于黑背景,这个属于亮背'99�
Theme_holo_Light_xxx其他和默认样式一样,区别于这是亮背景

作者:3Q竹林
链接:https://www.jianshu.com/p/a8067599ed1d
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值