PopWindowのAndroid 7.xの互換性の問題を処理します.

1499 ワード

著作権声明:本稿はtianmaから来ました.転載は必ず出典を明記してください.http://www.jianshu.com/p/e4778c185dc9
問題の説明
PopupWindowにおけるshow AsDropDowは、指定されたアンカーポイントViewの下にPopupWindowを表示するために使用され、Android 7.0(app<=23)以前は問題ありませんでしたが、Android 7.xシステムでは、ある場合に応じて互換性の問題が発生します.
  • PopupWindowの高さを指定するとMATCH_となります.PARTでshow AsDropDownを呼び出した場合、7.0前に、アンカーポイントのancherの下の端からスクリーンの底の間にPopWindowを表示します.7.0、7.1のシステム上のPopWindowは全体のスクリーン(ステータスバー以外)を占有します.
  • ポプラWindowの高さを指定したらWRAP_CONTENTは、show AsDropDown(View ancher)を呼び出した場合、互換性の問題が発生しません.
  • PopupWindowの高さをユーザー定義の値heightとして指定し、show AsDropDownを呼び出した場合、height>アンカーポイントancherの下の端とスクリーンの底の距離を指定すると、やはり7.0、7.1に異常な問題が表示されます.そうでないと、この問題は発生しません.状況1と2はケース3の特例であることがわかる.
  • ソリューション
    上記の分析における互換性の問題があれば、showAtLocation()を用いてshowADropDown()の代わりに使用できます.コード例は以下の通りです.詳細はPopWindowComputSampleを参照してください.
    if (Build.VERSION.SDK_INT >= 24) { // Android 7.x ,PopupWindow   match_parent ,        ,       
        int[] location = new int[2]; //   anchor       
        anchor.getLocationOnScreen(location);
        int offsetY = location[1] + anchor.getHeight();
        if (Build.VERSION.SDK_INT == 25) { // Android 7.1 ,PopupWindow    match_parent  ,       
            //       Android 7.1       
            int screenHeight = ScreenUtils.getScreenHeight(context); //       
            popupWindow.setHeight(screenHeight - offsetY); //      PopupWindow    
        }
        popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, offsetY);
    } else {
        popupWindow.showAsDropDown(anchor);
    }