当前位置:首页 » 安卓系统 » android中的popupwindow

android中的popupwindow

发布时间: 2023-03-26 21:35:37

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对话窗口,只需要简单的几句话:

  1. 创建Dialog

  2. 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();
  3. PopupWindow创建:需要获取对应的View
  4. ViewpopupWindow_view=getLayoutInflater().inflate(R.layout.activity_popupwindow_left,null,false);
    popupWindow=newPopupWindow(popupWindow_view,200,LayoutParams.MATCH_PARENT,true);
  5. 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中的程序。

热点内容
游戏辅编程 发布:2025-05-14 21:18:49 浏览:684
三菱plc一段二段密码什么意思 发布:2025-05-14 21:17:16 浏览:527
电脑开机密码忘记了怎么破解 发布:2025-05-14 21:09:40 浏览:56
pythondict格式 发布:2025-05-14 21:09:38 浏览:885
落叶片拍摄脚本 发布:2025-05-14 20:40:49 浏览:798
安卓为什么不能用cmwap 发布:2025-05-14 20:40:43 浏览:657
jquery获取上传文件 发布:2025-05-14 20:27:57 浏览:44
云web服务器搭建 发布:2025-05-14 20:25:36 浏览:526
汽修汽配源码 发布:2025-05-14 20:08:53 浏览:743
蜜蜂编程官网 发布:2025-05-14 19:59:28 浏览:58