PopupWindow 的灰色背景不包括工具栏/操作栏

Dimmed Background of PopupWindow excludes Toolbars / Action Bars

我使用以下代码通过单击 Toolbar 中的菜单项来创建具有暗淡背景的 PopupWindow

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case R.id.btn_1:
            Log.i(TAG, "Clicked Button 1");
            LayoutInflater layoutInflater = (LayoutInflater)getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
            View popupView = layoutInflater.inflate(R.layout.popup_window, null);

            final PopupWindow popupWindow = new PopupWindow(popupView, Toolbar.LayoutParams.MATCH_PARENT, Toolbar.LayoutParams.MATCH_PARENT);
            Button btnDismiss = (Button)popupView.findViewById(R.id.btn_dismiss);
            btnDismiss.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    popupWindow.dismiss();
                }
            });
            popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

但是,我想在暗淡的背景中排除操作栏/工具栏。我怎样才能实现它?

PopupView的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:id="@+id/bac_dim_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#C0000000"
        android:visibility="visible" >
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_margin="1dp"
            android:background="@android:color/darker_gray">
            >
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:layout_margin="20dp">
                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="It's a PopupWindow" />
                <Button
                    android:id="@+id/btn_dismiss"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="Dismiss" />
            </LinearLayout>
        </LinearLayout>
    </RelativeLayout>
</LinearLayout>

如果您希望弹出窗口 window 以昏暗的背景显示,除了 ToolBar/ActionBar

这里我尝试设置弹出窗口的位置window。获取状态栏和导航栏高度并将 Y 位置设置为弹出窗口

int actionBarHeight = 0;
                View popupView = LayoutInflater.from(getActivity()).inflate(R.layout.popup_, null);
                final PopupWindow popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
                actionBarHeight = getNavigationBarHeight(getActivity(), Configuration.ORIENTATION_PORTRAIT);
                int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
                if (resourceId > 0) {
                    actionBarHeight = actionBarHeight + getResources().getDimensionPixelSize(resourceId);
                }
                Button btnDismiss = (Button) popupView.findViewById(R.id.btn_dismiss);
                btnDismiss.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        popupWindow.dismiss();
                    }
                });
                popupWindow.showAsDropDown(popupView, 0, actionBarHeight);

另一种显示弹出窗口的方法,正如您在comment.Below中提到的,您可以尝试

在布局中取一个隐藏控件(TextView),它将与顶部对齐。获取 TextView 的位置并分配 Y 位置以弹出 window

public class MyPopupTest extends Fragment{
    public static final String TAG = "MyPopupTest";

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.home_screen_slider, container, false);
    }


    @Override
    public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        view.findViewById(R.id.btnSelect).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showPopup(view);
            }
        });
    }

    public void showPopup(View view) {
        View popupView = LayoutInflater.from(getActivity()).inflate(R.layout.popup_, null);
        final PopupWindow popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
        Button btnDismiss = (Button) popupView.findViewById(R.id.btn_dismiss);
        btnDismiss.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
            }
        });
        int[] locationOfHiddenTextView = new int[2];
        view.findViewById(R.id.hiddenTopTextView).getLocationOnScreen(locationOfHiddenTextView);
        //Give Position as a start point for popup
        popupWindow.showAsDropDown(popupView, 0, locationOfHiddenTextView[1]);
    }
}

XML要显示的片段文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relative_home"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffc699">


    <TextView
        android:id="@+id/hiddenTopTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:visibility="gone" />

    <Button
        android:id="@+id/btnSelect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show Popup" />

</RelativeLayout>

我有一个解决方案,但我只用 DialogFragment 测试过,不确定它是否适用于对话框。无论如何我都会post:
1. 创建自己的 class 扩展 DialogFragment。
2. 使用您设计的暗色创建 xml 文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:background="#80000000" // your designed dim color
          android:gravity="center"
          android:orientation="vertical">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/goto_dialog_title"
    android:textColor="@android:color/white"
    android:textSize="@dimen/km_25sp"/>

3. 覆盖 DialogFragment:

中的函数
private class MyDialog extends DialogFragment{
    //override your onCreateView to show your xml here

    //override onCreate to show dialog without border and without dim background
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setStyle(DialogFragment.STYLE_NO_FRAME, 0);
    }
    // override to show dim background and avoid dimming actionbar
    @Override
    public void onResume() {
        super.onResume();
        int statusBarAndActionBarHeight = 200; //u should calculate yourself
        Window window = getDialog().getWindow();
        // set size to your dialog --> fullscreen size to show dim bg all screen except action bar and status bar
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        window.setLayout(displaymetrics.widthPixels,    displaymetrics.heightPixels - statusBarAndActionBarHeight);
        //margin top to avoid dim background above actionbar and status bar
        WindowManager.LayoutParams p = window.getAttributes();
        p.y = statusBarAndActionBarHeight;
        getDialog().getWindow().setGravity(Gravity.TOP);
        getDialog().getWindow().setAttributes(p);
    }
}