android中的popupwindow
A. Android基础 (11) PopupWindow详解
(1)PopupWindow的使用
(2)自定义一个PopupWindow
(3)PopupWindow的源码分析
(4)AlertDialog,popupWindow,Activity区别
(5)Activity-Window-View三者的差别
Android的对话框有两种:PopupWindow和AlertDialog。它们的不同点在于:
PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下:
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移。
使用详述: https://blog.csdn.net/xiaanming/article/details/9121383
这里的WRAP_CONTENT可以换成fill_parent 也可以是具体的数值,它是指PopupWindow的大小,也就是contentView的大小,注意popupWindow根据这个大小显示你的View,如果你的View本身是从xml得到的,那么xml的第一层view的大小属性将被忽略。相当于popupWindow的width和height属性直接和第一层View相对应。
执行了一个attachToAnchor,意思是PopupWindow类似一个锚挂在目标view的下面,这个函数主要讲xoff、yoff(x轴、y轴偏移值)、gravity(比如Gravity.BOTTOM之类,指的是PopupWindow放在目标view哪个方向边缘的位置)这个attachToAnchor有点意思,通过弱引用保存目标view和目标view的rootView(我们都知道:通过弱引用和软引用可以防止内存泄漏)、这个rootview是否依附在window、还有保存偏差值、gravity
PopupWindow通过为传入的View添加一层包裹的布局,并重写该布局的点击事件,实现点击PopupWindow之外的区域PopupWindow消失的效果
封装库可前往:#### https://github.com/yangchong211/YCDialog
B. Android中Popupwindow和Dialog的区别
PopupWindow和Dialog可以实现同样的效果,默认情况下Dialog可以快速创建对应的dialog对话窗口,只需要简单的几句话:
创建Dialog
java">AlertDialogmDialog=null;
mDialog=newAlertDialog.Builder(this).create();;
mDialog.setIcon(R.drawable.ic_launcher);
mDialog.setTitle("系统提示");
mDialog.setMessage("你确定要退出吗?");
mDialog.setButton(DialogInterface.BUTTON_POSITIVE,"确定",null);
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE,"取消",null);
mDialog.show();PopupWindow创建:需要获取对应的View
ViewpopupWindow_view=getLayoutInflater().inflate(R.layout.activity_popupwindow_left,null,false);
popupWindow=newPopupWindow(popupWindow_view,200,LayoutParams.MATCH_PARENT,true);PopupWindow创建过程没有Dialog那么方便,Dialog创建对象后,设置对应的Title、Message、Button即可;PopupWindow可以创建的弹窗从当前视图的上下左右方向弹出,效果和Dialog居中显示有所区别
C. Android中Popupwindow和Dialog的区别
区别郑败袜如下:
1)Popupwindow在显示之前一定要设置宽高,Dialog无此限制。
2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。
3)Popupwindow不会给页枯丛面其他的部分添加蒙层,而Dialog会。
4)Popupwindow没有标题,Dialog默认有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消标题
5)二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。
6)二者都有默认的背景,都可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。
其中最本质的差别就是:AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。这两种区别的表现是:AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞喊激,这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞。
D. Android中Popupwindow和Dialog的区别
除了外观样式和显示的位置的区别之外斗者,他们之间最本质的区别是:
dialog是非空扮薯阻塞式对话框,popupwindow是阻塞式对话框。也就是说dialog弹出时
后台还可以进行很多的操作,而popupwindow弹出是
后台进程是阻塞的,要一直等待popupwindow
消失
才会进缺链行操作。
E. android中Dialog和PopupWindow的区别
1. Android的对话框有两种:PopupWindow和AlertDialog。 它们的不同点在于:AlertDialog的位置固定,而PopupWindow的位置可以随意 AlertDialog是非阻塞线程的,AlertDialog弹出的时候,后台可是还可以做其他事情的哦。 而PopupWindow是阻塞线程的, 这就意味着在我们退出这个弹出框之前,程序会一直等待 PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下 showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移 showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移 showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移 LayoutInflater layoutInflater = LayoutInflater.from(this); View popupWindow = layoutInflater.inflate(R.layout.popup, null);
F. Android弹窗探究之PopupWindow的使用
相对于AlertDialog的使用,PopupWindow的使用也比较简单,这里主要介绍的是PopupWindow的基础使用包括在使用过程中的一些注意事项,做个笔记。
方式一:
方式二:
当然,在实际的开发过程中我们并不能仅仅满足于如何简单使用,更多的时候我们需要去考虑兼容性与扩展性的问题,所以,在这里,我对PopupWindow做了一个简单的封装,如下所示:
创建PopupWindow的管理类,即PopupWindowManager类
新建类来继承自PopupWindow
最后进行调用:
到这里,popupWindow的简单使用就完成了。最后来讲一下在使用popupWindow的过程中需要注意的几点。
(1)必须手动给popupWindow设置宽度和高度,否则popupWindow不显示。
(2)在手机系统的API大于24的时候全屏展示的时候会完全填充整个屏幕,而不是在目标View的下方正常显示。
(3)在有些手机上面,全屏展示的时候底部会留白,其实是因为StatusBar的高度没有计算进去,需要我们自己手动计算出去。
(4)当我们设置了setFocusable为true的时候,点击屏幕事件会交由onTouchListener处理。
G. Android中Popupwindow和Dialog的区别
Dialog 显示的伏源位置比较固定。
PopupWindow可以通过showAtLocation设置显示历拦位置,也可以通过ShowAsDropDown显示在某个View的相对缺烂态位置
H. Android PopupWindow 在开发过程中有哪些坑
自Android 4.4起,引入了webView,使用需要注意的事项:
1.多线程
如果你在子线程中调用WebView的相关方法,而不在UI线程,则可能会出现无法预料的错误。
所以,当你的程序中需要用到多线程时候,也请使用 runOnUiThread()方法来保证你关于WebView的操作是在UI线程中进行的:
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
//CodeforWebViewgoeshere
}
});
2.线程阻塞
永远不要阻塞UI线程,这是开发Android程序的一个真理。虽然是真理,我们却往往不自觉的
犯一些错误违背它,一个开发中常犯的错误就是:在UI线程中去等待JavaScript 的回调。
例如:
//
webView.loadUrl("javascript:fn()");while(result==null){
Thread.sleep(100);}
千万不要这样做,Android 4.4中,提供了新的Api来做这件事情。 evaluateJavascript() 就是
专门来异步执行JavaScript代码的。
3.evaluateJavascript() 方法
专门用于异步调用JavaScript方法,并且能够得到一个回调结果。
示例:
mWebView.evaluateJavascript(script,newValueCallback<String>(){
@Override
publicvoidonReceiveValue(Stringvalue){
//TODO
}
});
4.处理 WebView 中 url 跳转
新版WebView对于自定义scheme的url跳转,新增了更为严格的限制条件。 当你实现了
shouldOverrideUrlLoading() 或 shouldInterceptRequest() 回调,WebView 也只会在跳转
url是合法Url时才会跳转。
例如,如果你使用这样一个url :
<ahref="showProfile"]]>Show Profile</a>
shouldOverrideUrlLoading() 将不会被调用。
正确的使用方式是:
<ahref="example-app:showProfile"]]>Show Profile</a>
对应的检测Url跳转的方式:
//TheURLschemeshouldbenon-hierarchical(notrailingslashes)
privatestaticfinalStringAPP_SCHEME="example-app:";
@(WebViewview,String
url){
if(url.startsWith(APP_SCHEME)){
urlData=URLDecoder.decode(url.substring(APP_SCHEME.length()),"UTF-8");
respondToData(urlData);
returntrue;
}
returnfalse;}
当然,也可以这样使用:
webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,
null,"UTF-8",null);
5.UserAgent 变化
如果你的App对应的服务端程序,会根据客户端传来的UserAgent来做不同的事情,那么你需
要注意的是,新版本的WebView中,UserAgent有了些微妙的改变:
Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16H)
AppleWebKit/537.36(KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0
Mobile Safari/537.36
使用 getDefaultUserAgent()方法可以获取默认的UserAgent,也可以通过:
mWebView.getSettings().setUserAgentString(ua);
mWebView.getSettings().getUserAgentString();
来设置和获取自定义的UserAgent。
6.使用addJavascriptInterface()的注意事项
从Android4.2开始。 只有添加 @JavascriptInterface 声明的Java方法才可以被JavaScript调用,例如:
classJsObject{
@JavascriptInterface
publicStringtoString(){return"injectedObject";}
}
webView.addJavascriptInterface(newJsObject(),"injectedObject");
webView.loadData("","text/html",null);
webView.loadUrl("javascript:alert(injectedObject.toString())");
7.Remote Debugging
新版的WebView还提供了一个很厉害的功能:使用Chrome来调试你运行在WebView中的程序。