android 7.0
1、 PopupWindow的showAsDropDown位置问题 参数无效
现象:在7.0以上,我们会发现一个问题。当使用showAsDropDown方法,将PopupWindow显示在某控件下方的时候,会出现位置错位的问题,PopupWindow的起始点跑到了屏幕顶部。
分析:出现的原因是因为,在Android7.0以后,PopupWindow的显示会有一个判断,当PopupWindow的高度大于屏幕的剩余高度时,会往控件上方超出。因为这边给PopupWindow设置的高度是
所以,PopupWindow会起始点会跑到了屏幕顶部
解决方案:
@Override
public void showAsDropDown(View anchor) {
if(Build.VERSION.SDK_INT >= 24) {
Rect rect = new Rect();
anchor.getGlobalVisibleRect(rect);
int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
setHeight(h);
}
super.showAsDropDown(anchor);
}
参考:Android7.0上PopupWindow的showAsDropDown位置问题 参数无效
android 9.0
1、 Detected problems with API compatibility(visit g.co/dev/appcompat for more info)
自从手机系统升级到Android 9.0以后,打开APP开始出现以上提示,出现这种情况的原因是:
Android P 后谷歌限制了开发者调用非官方公开API 方法或接口,也就是说,你用反射直接调用源码就会有这样的提示弹窗出现,非 SDK 接口指的是 Android 系统内部使用、并未提供在 SDK 中的接口,开发者可能通过 Java 反射、JNI 等技术来调用这些接口。但是,这么做是很危险的:非 SDK 接口没有任何公开文档,必须查看源代码才能理解其行为逻辑。
但是源码是JAVA写的,万物皆可反射,所以还是可以用反射干掉这个 每次启动都会弹出的提醒窗口。
//在app初始化时调用即可
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
disableAPIDialog();
}
/**
* 反射 禁止弹窗
*/
private void disableAPIDialog(){
if (Build.VERSION.SDK_INT < 28)return;
try {
Class clazz = Class.forName("android.app.ActivityThread");
Method currentActivityThread = clazz.getDeclaredMethod("currentActivityThread");
currentActivityThread.setAccessible(true);
Object activityThread = currentActivityThread.invoke(null);
Field mHiddenApiWarningShown = clazz.getDeclaredField("mHiddenApiWarningShown");
mHiddenApiWarningShown.setAccessible(true);
mHiddenApiWarningShown.setBoolean(activityThread, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}