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

标签 android android-actionbar android-toolbar android-popupwindow

我使用以下代码通过单击 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>

最佳答案

如果你想让弹窗以暗淡的背景显示,除了ToolBar/ActionBar

我在这里尝试设置弹出窗口的位置。获取状态栏和导航栏高度并将 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);

另一种方式如您在评论中所说显示弹出窗口。下面提到您可以尝试

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

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]);
    }
}

要显示的 fragment 的 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>

关于android - PopupWindow 的灰色背景不包括工具栏/操作栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34351163/

相关文章:

android - 我更改了工具栏汉堡包图标,但单击时它没有打开抽屉菜单

android - 如何使用联系人的 lookup_key 删除联系人

android - 在 Android SQLite 原始查询中处理 WHERE IN(?)

Android 如何在操作栏中制作可点击的 Logo 图标?

android - ActionBar 向上导航重新创建父 Activity 而不是 onResume

Android去除透明导航 View 的阴影

java - 忽略过期的 ssl 证书

Android IntentService 无法实例化类;没有空的构造函数

android - 操作栏按钮背景

java - 当重力=顶部时,文本不会从顶部开始