欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

在Activity的onCreate方法中顯示PopupWindow導(dǎo)致異常的 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

在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)用如下辦法:
    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)案例查看更多