popupWindow.setElevation()怎样兼容到API21以下呢

项目里有个地方用到了PopupWindowsetElevation() 但是这个方法只支持API21以上,我看有个PopupWindowCompat,但是里面好像没有什么有用的方法,请问应该如何兼容API21以下的版本呢

图片描述

阅读 5.7k
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属性的, 因此, 上述调用都只是做了兼容处理保证不崩溃而已.

另外一种思路:

  1. 高版本通过设置elevation

  2. 低版本通过Background Drawable

p.s.为什么不干脆都用Background Drawable

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题