當前位置:首頁 » 安卓系統 » 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 17:16:20 瀏覽:454
我的世界炸毀50萬伺服器 發布:2025-05-14 17:16:07 瀏覽:122
存儲站源 發布:2025-05-14 17:14:20 瀏覽:863
win2008的ftp設置 發布:2025-05-14 17:03:31 瀏覽:663
萊克發的工資卡密碼是多少 發布:2025-05-14 16:57:10 瀏覽:178
方舟怎麼用自己的存檔進入別人的伺服器 發布:2025-05-14 16:46:25 瀏覽:877
微博視頻高清上傳設置 發布:2025-05-14 16:38:41 瀏覽:548
資料庫圖書管理設計 發布:2025-05-14 16:33:52 瀏覽:378
php開發的網頁 發布:2025-05-14 16:22:03 瀏覽:477
伺服器內存跑滿了怎麼回事 發布:2025-05-14 16:21:16 瀏覽:224