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を参照してください.
問題の説明
PopupWindowにおけるshow AsDropDowは、指定されたアンカーポイントViewの下にPopupWindowを表示するために使用され、Android 7.0(app<=23)以前は問題ありませんでしたが、Android 7.xシステムでは、ある場合に応じて互換性の問題が発生します.
上記の分析における互換性の問題があれば、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);
}