知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
在Activity的onCreate方法中顯示PopupWindow導(dǎo)致異常的
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):89
一、媒介
在某些情況下,我們須要一進入Activity就顯示PopupWindow,比如常見的選擇界面。但因為PopupWindow是依附于Activity的,如不雅Activity沒有創(chuàng)建完成,Activity還沒完全顯示出來就顯示PopupWindow的話,會出現(xiàn)異?,F(xiàn)象。
二、問題復(fù)現(xiàn)
我在Activity的onCreate()辦法中調(diào)用如下辦法:
運行法度榜樣的時刻出現(xiàn)如下異常:
[img]http://img.my.csdn.net/uploads/201412/30/1419942066_6251.jpg
三、解決籌劃
在StackOverflow上搜刮這個問題你會發(fā)明,都沒有原因分析,但我在《Android開辟精要》一書中找到了謎底(P158):
PopupWindow不像對話框那樣大年夜屏幕的固定地位彈出,而是依附于錨點控件對象的地位,所慰漢點控件對象,就是界面組件中的某個控件,PopupWindow的┞飯示和功能都是以它為核心,作為錨點控件的擴大交互界面,以加強該控件對象的功能。
彈出窗口與描點控件有著慎密的接洽,在構(gòu)造并展示彈出窗口前,須要包管錨點控件地點的控件樹已經(jīng)與窗口治理辦事建立連接,因為在彈出窗口的┞飯示過程中,須要經(jīng)由過程該窗口對象來獲取相干信息。在界面組件的構(gòu)造過程中,窗口連接的建立是個異步過程,也就是說,當(dāng)Activity.onCreate()等函數(shù)被調(diào)用時,界面與窗口治理辦事的雙向通信連接尚未建立,如不雅在此時構(gòu)造彈出窗口則會拋出異常。是以,如不雅期望在界面組件展示之處便構(gòu)造彈出窗口,可以將彈出窗口對象構(gòu)造也轉(zhuǎn)換成一個異步過程。
在與窗口治理辦事未建立連接之前,界面組件精曉過View.post函數(shù)發(fā)送過來的消息放入一個靜態(tài)隊列傍邊,在通信連接建立完成后,再大年夜該隊列中攫撤消息并一一履行。是以,經(jīng)由過程如許的實現(xiàn)模許可以包管彈出窗口展示時窗口通信連接已經(jīng)構(gòu)建成功。
所以對于膳綾擎的問題,最簡單的處理辦法是,異步顯示PopupWindow就好了:
四、題外話
今天想做一個在PopupWindow瑯綾擎播放視頻的功能,結(jié)不雅發(fā)明SurfaceView在PopupWindow中是無法正常顯示的,如不雅須要顯示SurfaceView,建議用View、Fragment或者Dialog Activity代替PopupWindow。我在StackOverflow上查了一下,說是SurfaceView必須要依附于window,但PopupWindow是依附于View的,所以Surfaceview在PopupWindow中無法正常創(chuàng)建,可拜見:SurfaceView not working inside PopupWindow
在某些情況下,我們須要一進入Activity就顯示PopupWindow,比如常見的選擇界面。但因為PopupWindow是依附于Activity的,如不雅Activity沒有創(chuàng)建完成,Activity還沒完全顯示出來就顯示PopupWindow的話,會出現(xiàn)異?,F(xiàn)象。
二、問題復(fù)現(xiàn)
我在Activity的onCreate()辦法中調(diào)用如下辦法:
public void show( ){ if( null != mPopupWindow ){ mPopupWindow.showAtLocation(mView, Gravity.CENTER, 0, 0); } }
運行法度榜樣的時刻出現(xiàn)如下異常:
[img]http://img.my.csdn.net/uploads/201412/30/1419942066_6251.jpg
三、解決籌劃
在StackOverflow上搜刮這個問題你會發(fā)明,都沒有原因分析,但我在《Android開辟精要》一書中找到了謎底(P158):
PopupWindow不像對話框那樣大年夜屏幕的固定地位彈出,而是依附于錨點控件對象的地位,所慰漢點控件對象,就是界面組件中的某個控件,PopupWindow的┞飯示和功能都是以它為核心,作為錨點控件的擴大交互界面,以加強該控件對象的功能。
彈出窗口與描點控件有著慎密的接洽,在構(gòu)造并展示彈出窗口前,須要包管錨點控件地點的控件樹已經(jīng)與窗口治理辦事建立連接,因為在彈出窗口的┞飯示過程中,須要經(jīng)由過程該窗口對象來獲取相干信息。在界面組件的構(gòu)造過程中,窗口連接的建立是個異步過程,也就是說,當(dāng)Activity.onCreate()等函數(shù)被調(diào)用時,界面與窗口治理辦事的雙向通信連接尚未建立,如不雅在此時構(gòu)造彈出窗口則會拋出異常。是以,如不雅期望在界面組件展示之處便構(gòu)造彈出窗口,可以將彈出窗口對象構(gòu)造也轉(zhuǎn)換成一個異步過程。
// 在界面組件onCreate函數(shù)中調(diào)用 final View anchor = findViewById(R.id.anchor); anchor.post(new Runnable(){ @Override public void run(){ // 構(gòu)造和展示彈出窗口 PopupWindow window = createWindow(); window.showAsDropDown(anchor); } });
在與窗口治理辦事未建立連接之前,界面組件精曉過View.post函數(shù)發(fā)送過來的消息放入一個靜態(tài)隊列傍邊,在通信連接建立完成后,再大年夜該隊列中攫撤消息并一一履行。是以,經(jīng)由過程如許的實現(xiàn)模許可以包管彈出窗口展示時窗口通信連接已經(jīng)構(gòu)建成功。
所以對于膳綾擎的問題,最簡單的處理辦法是,異步顯示PopupWindow就好了:
public void show( ){ mView.post( new Runnable( ) { @Override public void run() { if( null != mPopupWindow ){ mPopupWindow.showAtLocation(mView, Gravity.CENTER, 0, 0); } } }); }
四、題外話
今天想做一個在PopupWindow瑯綾擎播放視頻的功能,結(jié)不雅發(fā)明SurfaceView在PopupWindow中是無法正常顯示的,如不雅須要顯示SurfaceView,建議用View、Fragment或者Dialog Activity代替PopupWindow。我在StackOverflow上查了一下,說是SurfaceView必須要依附于window,但PopupWindow是依附于View的,所以Surfaceview在PopupWindow中無法正常創(chuàng)建,可拜見:SurfaceView not working inside PopupWindow
相關(guān)案例查看更多
相關(guān)閱讀
- 搜索引擎排名
- 云南網(wǎng)絡(luò)營銷顧問
- 北京小程序制作
- 云南網(wǎng)頁制作
- 小程序模板開發(fā)公司
- 云南網(wǎng)站建設(shè)特性
- 網(wǎng)絡(luò)公司哪家好
- asp網(wǎng)站
- 商標(biāo)注冊
- 小程序開發(fā)費用
- 報廢車回收管理軟件
- 做網(wǎng)站
- 百度小程序開發(fā)公司
- 迪慶小程序開發(fā)
- 云南網(wǎng)站建設(shè)價格
- web學(xué)習(xí)路線
- 小程序設(shè)計
- 昆明小程序代建
- 網(wǎng)站制作哪家好
- 百度快速排名
- 搜索排名
- 云南手機網(wǎng)站建設(shè)
- 開發(fā)制作小程序
- 分銷系統(tǒng)
- 網(wǎng)站優(yōu)化公司
- 楚雄小程序開發(fā)
- 安家微信小程序
- 小程序定制
- 網(wǎng)站建設(shè)百度官方
- 正規(guī)網(wǎng)站建設(shè)公司