Search code examples
androidandroid-actionbarandroid-toolbarandroid-popupwindow

Dimmed Background of PopupWindow excludes Toolbars / Action Bars


I use the following codes to create a PopupWindow with dim background by clicking a menu item in Toolbar:

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

However, I want to the dim background to exclude the action bars / toolbars. How can I achieve it?

The layout of the PopupView is as follow:

<?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>

Solution

  • if you want popup window to display with dim background except ToolBar/ActionBar

    here i tried setting position of popup window. fetch statusbar & navigation bar height & set Y position to the popup

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

    Another way to display popup as you said in comment.Below mentioned you can try

    Take one hidden control(TextView) in layout which will be aligned to top. Take the location of the TextView & assigned Y position to popup 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 File of the fragment which is goint to display

    <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>