Android PopupWindow高程不显示阴影

Pat*_*ick 27 android android-popupwindow android-5.0-lollipop

设置标高时,Android Popwindow不显示阴影.它似乎从文档中支持它.我正在使用5.0 Lollipop.

创建弹出窗口如下:

    popupWindow = new PopupWindow(context);
    popupWindow.setOutsideTouchable(true);
    popupWindow.setFocusable(true);
    popupWindow.setElevation(10);
    popupWindow.setContentView(rootView);
    popupWindow.showAtLocation(anchorView, Gravity.NO_GRAVITY, xPos, yPos);
Run Code Online (Sandbox Code Playgroud)

Mar*_*ues 24

正如Android开发人员回答的那样.

如果膨胀的视图没有背景设置,或者弹出窗口本身没有背景设置(或具有透明背景),那么您将不会获得阴影.

这是我的情况,似乎是你的,因为你没有使用setBackgroundDrawable.

这对我有用

popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
Run Code Online (Sandbox Code Playgroud)

我已经打开了一个新问题,建议他们更新文档(https://code.google.com/p/android/issues/detail?id=174919)


Sur*_*gch 13

对于访问此答案并错过 OP 已有内容的其他人,您应该设置高程以创建阴影:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    popupWindow.setElevation(20);
}
Run Code Online (Sandbox Code Playgroud)

带阴影的弹出窗口

根据您的内容视图是什么,您可能还需要设置背景可绘制,尽管这并不总是必要的。如果需要,您可以按照@Maragues 的建议进行操作:

popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
Run Code Online (Sandbox Code Playgroud)

要支持 Lollipop 之前的设备,您可以使用包含阴影的 9-patch 或图像。

代码

这是上图的代码。

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = inflater.inflate(R.layout.popup_window, null);
int width = LinearLayout.LayoutParams.WRAP_CONTENT;
int height = LinearLayout.LayoutParams.WRAP_CONTENT;
boolean focusable = true;
final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);
popupView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        popupWindow.dismiss();
        return true;
    }
});

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    popupWindow.setElevation(20);
}

popupWindow.showAtLocation(anyView, Gravity.CENTER, 0, 0);
Run Code Online (Sandbox Code Playgroud)

笔记:

在代码中设置时,高程以像素为单位,但在 xml 中设置时通常以 dp 为单位。在代码中设置时,您应该将 dp 值转换为像素。