Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set margins to a custom dialog?

Tags:

android

dialog

Does anybody knows how can I set margins to a custom dialog? I'm asking because I've a custom dialog but when displayed it stretches to fill the parent, even though I set explicitly WRAP_CONTENT on the layout params.

Basically, the dialog contains a listview whose elements must be scrolled down, when the elements are 1 for example, it doesn't stretch, but when more items are added, then the dialog occupies the entire screen.

Any suggestions? I've trying all possible combinations of possible solutions without achieving satisfactory results

EDIT: Added the dialog layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="50dip"   
    android:orientation="vertical"
    android:layout_gravity="top|center">

    <FrameLayout android:layout_width="fill_parent" android:layout_margin="5dip" android:layout_height="wrap_content">

            <TextView android:layout_width="wrap_content"        android:layout_height="wrap_content" 
                android:layout_gravity="center"
                android:textSize="20sp" android:textColor="@color/black"/>

            <Button android:layout_height="32dip" android:layout_width="32dip" 
                android:id="@+id/guide_dialog_cross_button"
                android:background="@drawable/button_cross_white"/>

        </FrameLayout>


    <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" 
        android:fadingEdge="none"
        android:layout_margin="5dip"/>

    <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_margin="5dip" />

</LinearLayout>
like image 590
lblasa Avatar asked May 27 '11 14:05

lblasa


4 Answers

Margins don't work for Dialogs, I imagine the top-level window view isn't a layout type that supports margins. I've seen posts saying margins will work when defined as the Dialog's style (rather than on the top-level view element), but this does not seem to work either.

What you need to do to work around the issue is to use an inset drawable for your Dialog background, and adjust any padding to account for the background's extra inset. In the example below, I'll just set left & right margins.

Dialog background drawable:

<?xml version="1.0" encoding="utf-8"?>
<!-- drawable is a reference to your 'real' dialog background -->
<!-- insetRight and insetLeft add the margins -->
<inset
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/dialog_background" 
    android:insetRight="10dp"
    android:insetLeft="10dp">
</inset>

Dialog main view:

<?xml version="1.0" encoding="utf-8"?>
<!-- paddingTop / paddingBottom padding for the dialog -->
<!-- paddingLeft / paddingRight padding must add the additional inset space to be consistent -->
<!-- background references the inset background drawable -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:paddingLeft="15dp"
    android:paddingRight="15dp"
    android:background="@drawable/dialog_background_inset">

<!-- ...the rest of the layout... -->

You may also need to set the background colour of the Dialog itself to transparent. Add a colour resource like so:

<color name="transparent">#00000000</color>

And set the window background colour of the dialog to this (note: you can't assign the colour directly, eclipse will complain)

<style name="Dialog" parent="android:style/Theme.Dialog">
    <item name="android:windowBackground">@color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
</style>

This style should be passed to your Dialog's constructor as the theme argument, as in new Dialog(context, R.style.Dialog);

like image 120
pospi Avatar answered Nov 04 '22 11:11

pospi


I had the same problem and I solved it by setting the window background on an InsetDrawable:

AlertDialog.Builder builder = new AlertDialog.Builder(context);
...
...
AlertDialog dialog = builder.create();

ColorDrawable back = new ColorDrawable(Color.TRANSPARENT);
InsetDrawable inset = new InsetDrawable(back, 20);
dialog.getWindow().setBackgroundDrawable(inset);

dialog.show();

In this case the dialog will appear with a margin of 20 to all edges.

like image 41
simpleApps Avatar answered Nov 04 '22 11:11

simpleApps


Margin doesnt seem to work on the custom layout for the dialog, but padding works. Try setting the padding on the top level Linear layout.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="4dp"
    android:paddingRight="4dp" >
like image 20
Nimesh Madhavan Avatar answered Nov 04 '22 13:11

Nimesh Madhavan


As @simpleApps and @pospi pointed out, you need to add insets to the backgroundDrawable of the Dialog. If you are using a custom dialog, you can try with a drawable defined in a xml

dialog?.window?.setBackgroundDrawableResource(R.drawable.background_dialog)

where R.drawable.background_dialog is defined as

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="20dp"
    android:insetTop="40dp"
    android:insetRight="20dp"
    android:insetBottom="40dp">
    <shape android:shape="rectangle">
        <solid android:color="@color/color_background_fragment" />
        <corners android:radius="10dp" />
    </shape>
</inset>
like image 14
Jesús Barrera Avatar answered Nov 04 '22 11:11

Jesús Barrera