Dimmed Background of PopupWindow excludes Toolbars / Action Bars
Asked Answered
B

2

2

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>
Biparietal answered 18/12, 2015 at 8:15 Comment(2)
you want actionbar/toolbar as disable or just not to be dimmed ?Disgusting
I don't want the action bar / toolbar to be disabled nor dimmed. Just want to leave it as it is.Biparietal
D
1

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>
Disgusting answered 18/12, 2015 at 9:6 Comment(1)
Looks promising. Thanks !Biparietal
C
0

I have a solution, but I only test with DialogFragment, not sure it works with dialog or not. I will post it anyway:
1. create your own class which extends DialogFragment.
2. create xml file with your designed dim color:

<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. Override funcions in your 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);
    }
}
Charmaincharmaine answered 18/12, 2015 at 9:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.