Search code examples
androidandroid-dialogfragment

Setting the size of a DialogFragment


I have been trying many commands to setup the size of my DialogFragment. It only contains a color-picker, so I have removed the background and title of the dialog:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(
    new ColorDrawable(android.graphics.Color.TRANSPARENT));

However I also want to position the dialog where I want and it is problematic. I use:

WindowManager.LayoutParams params = getDialog().getWindow().getAttributes();
params.width = LayoutParams.WRAP_CONTENT;
params.height =  LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.LEFT;
getDialog().getWindow().setAttributes(params);

But one (big) obstacle remains: even though my dialog pane is invisible, it still has a certain size, and it limits the positions of my dialog. The LayoutParams.WRAP_CONTENT are here to limit the size of this pane to my color-picker, but for some reason it does not work.

Has anyone been able to do something similar?


Solution

  • After some trial and error, I have found the solution.

    here is the implementation of my DialogFragment class :

    public class ColorDialogFragment extends SherlockDialogFragment {
    
        public ColorDialogFragment() {
        //You need to provide a default constructor
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container,
                         Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_color_picker, container);
        // R.layout.dialog_color_picker is the custom layout of my dialog
        WindowManager.LayoutParams wmlp = getDialog().getWindow().getAttributes();
        wmlp.gravity = Gravity.LEFT;
        return view;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_FRAME, R.style.colorPickerStyle);
        // this setStyle is VERY important.
        // STYLE_NO_FRAME means that I will provide my own layout and style for the whole dialog
        // so for example the size of the default dialog will not get in my way
        // the style extends the default one. see bellow.        
        }
    
      }
    

    R.style.colorPickerStyle corresponds to :

    <style name="colorPickerStyle" parent="Theme.Sherlock.Light.Dialog">
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:cacheColorHint">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>
    

    I simply extend a default Dialog style with my needs.

    Finally, you can invoke this dialog with :

    private void showDialog() {
       ColorDialogFragment newFragment = new ColorDialogFragment();
       newFragment.show(getSupportFragmentManager(), "colorPicker");
       }