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中的程序。