當前位置:首頁 » 安卓系統 » popupwindowandroid

popupwindowandroid

發布時間: 2023-01-31 17:13:14

① Android彈窗探究之PopupWindow的使用

相對於AlertDialog的使用,PopupWindow的使用也比較簡單,這里主要介紹的是PopupWindow的基礎使用包括在使用過程中的一些注意事項,做個筆記。

方式一:

方式二:

當然,在實際的開發過程中我們並不能僅僅滿足於如何簡單使用,更多的時候我們需要去考慮兼容性與擴展性的問題,所以,在這里,我對PopupWindow做了一個簡單的封裝,如下所示:

創建PopupWindow的管理類,即PopupWindowManager類

新建類來繼承自PopupWindow

最後進行調用:

到這里,popupWindow的簡單使用就完成了。最後來講一下在使用popupWindow的過程中需要注意的幾點。

(1)必須手動給popupWindow設置寬度和高度,否則popupWindow不顯示。
(2)在手機系統的API大於24的時候全屏展示的時候會完全填充整個屏幕,而不是在目標View的下方正常顯示。
(3)在有些手機上面,全屏展示的時候底部會留白,其實是因為StatusBar的高度沒有計算進去,需要我們自己手動計算出去。
(4)當我們設置了setFocusable為true的時候,點擊屏幕事件會交由onTouchListener處理。

② 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

③ android的PopupWindow怎麼添加邊框

popUpWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.page2));
設置的是popupwindow(window容器)的背景。
popUpWindow = new PopupWindow(show_popvieView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); //是將show_popvieView放入容器中,以自適應作為大小,且容器也採用自適應。
綜上,如果你設置大小,導致show_popvieView沾滿整個屏幕,那麼window容器最為底層,設置的背景坑定是看不見的。
建議:背景設置採用設置show_popvieView的背景。如果有多層,可以在內容裡面鑲嵌,最好別直接設置外層popupwindow容器

④ android中Dialog和PopupWindow的區別

Android中的對話框有兩種:PopupWindow和AlertDialog。它們都可以實現彈窗功能,但是他們之間有一些差別,下面總結了一點。 (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,其他操作被阻塞。 我們在寫程序的過程中可以根據自己的需要選擇使用Popupwindow或者是Dialog。

⑤ Android Popwindow使用總結

1.基本屬性方法

2.在彈窗出現後讓背景變暗,並在彈窗消失後讓背景還原

3.添加動畫
自定義一個動畫

添加動畫

只有同時設置PopupWindow的背景和可以響應外部點擊事件,它才能「真正」響應外部點擊事件。也就是說,當你點擊PopupWindow的外部或者按下「Back」鍵時,PopupWindow才會消失。

1.在popwindow中嵌套viewpager時候,關於定位問題:首先保證viewpager類是同一個,就是沒有新new一個類。然後在show的時候記得setCurrentItem()一下就好了。

Android PopupWindow使用方法小結
Android中文API——PopupWindow
喵印~~

⑥ Android中Popupwindow和Dialog的區別

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);

⑦ Android PopupWindow 在開發過程中有哪些坑

自Android 4.4起,引入了webView,使用需要注意的事項:


1.多線程


如果你在子線程中調用WebView的相關方法,而不在UI線程,則可能會出現無法預料的錯誤。


所以,當你的程序中需要用到多線程時候,也請使用 runOnUiThread()方法來保證你關於WebView的操作是在UI線程中進行的:

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

⑧ android中PopupWindow彈出窗體後,為什麼不能點擊其他控制項

設置popupwindow可點擊
mPopupWindow.setFocusable(true); // 設置PopupWindow可獲得焦點
mPopupWindow.setTouchable(true); // 設置PopupWindow可觸摸
補充:
默認打開popupwindow是沒有焦點和不可點擊的。因此需要設置點擊事件。

⑨ android service中怎麼彈popupwindow

Android PopupWindow怎麼合理控制彈出位置 void showPopupWindow(View parent) { if (popupWindow == null) { LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = layoutInflater.inflate(R.layout.group_list, null); lv_group = (ListView) view.findViewById(R.id.lvGroup); Collections.reverse(groups); GroupAdapter groupAdapter = new GroupAdapter(this, groups); lv_group.setAdapter(groupAdapter); popupWindow = new PopupWindow(view, 200, 220); } popupWindow.setFocusable(true); popupWindow.setOutsideTouchable(true); //設置點擊屏幕其它地方彈出框消失 popupWindow.setBackgroundDrawable(new BitmapDrawable()); WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); int xPos = -popupWindow.getWidth() / 2 + getCustomTitle().getCenter().getWidth() / 2; popupWindow.showAsDropDown(parent, xPos, 4); lv_group.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { loadNew(((StringItem)(groups.get(position))).getId()); if (popupWindow != null) popupWindow.dismiss(); } }); }只需要設置proupwindows的setOutsideTouchable屬性即可。 以下為示例代碼: window.showAtLocation(parent, Gravity.RIGHT Gravity.BOTTOM, 10,10);//顯示位置 第一個參數指定PopupWindow的錨點view,即依附在哪個view上。 第二個參數指定起始點 第三個參數設置以起始點的右下角為原點,向左、上各偏移的像素。 自己看下API

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:336
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:944
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:741
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:372