android - popupWindow.setElevation()怎样兼容到API21以下呢
问题描述
项目里有个地方用到了PopupWindow的setElevation() 但是这个方法只支持API21以上,我看有个PopupWindowCompat,但是里面好像没有什么有用的方法,请问应该如何兼容API21以下的版本呢

问题解答
回答1:正常方法是没有的, 但是通过Java反射还是能实现的, 只是实现了, elevation的效果也是出不来的. 先看看Android源码:
public class PopupWindow { ... ... private View mBackgroundView; public void setElevation(float elevation) {mElevation = elevation; } private void preparePopup(WindowManager.LayoutParams p) {... ...// The background owner should be elevated so that it casts a shadow.mBackgroundView.setElevation(mElevation); }}
从上面的代码, 可以知道只要通过反射获取到mBackgroundView, 然后调用ViewCompat.setElevation(View, float)就算完成工作了. 但是由于低版本是没有elevation属性的, 因此, 上述调用都只是做了兼容处理保证不崩溃而已.
另外一种思路:
高版本通过设置elevation
低版本通过Background Drawable
p.s.为什么不干脆都用Background Drawable
相关文章:
1. javascript - react能够使用什么时间插件2. docker api 开发的端口怎么获取?3. node.js - 我是一个做前端的,求教如何学习vue,node等js引擎?4. 如何解决Centos下Docker服务启动无响应,且输入docker命令无响应?5. PHP中的$this代表当前的类还是方法?6. 如何解决docker宿主机无法访问容器中的服务?7. 前端 - 类到底该如何去命名 .newsList 这种的命名难道真的不是过度语义化吗?~8. java - 为什么第一个线程已经释放了锁,第二个线程却不行?9. 老师,flex-shrink: 1; 按视频操作,不会自动缩放10. sublime-text - sublime text 3中编译python(sublimeREPL),如何仅运行单行/选定部分

网公网安备