转载
首先我们先达成一个共识: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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。