how to set margin in Dialog

后端 未结 6 1347
情歌与酒
情歌与酒 2020-12-16 17:25

I have used Dialog for display ad in my Andorid app.But I have to display this Dialog about 50dp top from buttom so i think we should set Dia

相关标签:
6条回答
  • 2020-12-16 17:39

    Well, what best worked for me was to wrap my dialog view inside a FrameLayout and add padding, and set onClickListener to "dismiss" dialog. Like this:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/parentFl"
        android:background="@android:color/transparent"
        android:padding="@dimen/vvlarge_margin">
    
    
     dialog?.window?.setBackgroundDrawable(context?.getDrawable(android.R.color.transparent))
     view.parentFl.setOnClickListener { dismiss() }
    
    0 讨论(0)
  • 2020-12-16 17:44

    WindowManager.LayoutParams:
    public int x: X position... When using LEFT or START or RIGHT or END it provides an offset from the given edge
    public int y: Y position... When using TOP or BOTTOM it provides an offset from the given edge
    (http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#x)
    thus:

    final Dialog dialog = new Dialog(context);
        // ...
        // e.g. top + right margins:
        dialog.getWindow().setGravity(Gravity.TOP|Gravity.RIGHT);
        WindowManager.LayoutParams layoutParams = dialog.getWindow().getAttributes();
        layoutParams.x = 100; // right margin
        layoutParams.y = 170; // top margin
        dialog.getWindow().setAttributes(layoutParams);
        // e.g. bottom + left margins:
        dialog.getWindow().setGravity(Gravity.BOTTOM|Gravity.LEFT);
        WindowManager.LayoutParams layoutParams = dialog.getWindow().getAttributes();
        layoutParams.x = 100; // left margin
        layoutParams.y = 170; // bottom margin
        dialog.getWindow().setAttributes(layoutParams);

    // etc.
    0 讨论(0)
  • 2020-12-16 17:46

    This is an approach to set all four margins without having to care about gravity.

    I tested my approach for a DialogFragment by applying it in the onCreateDialog method:

    public Dialog onCreateDialog( Bundle savedInstanceState )
    {
        // create dialog in an arbitrary way
        Dialog dialog = super.onCreateDialog( savedInstanceState ); 
        DialogUtils.setMargins( dialog, 0, 150, 50, 75 );
        return dialog;
    }
    

    This is the method applying the margins to the dialog:

    public static Dialog setMargins( Dialog dialog, int marginLeft, int marginTop, int marginRight, int marginBottom )
    {
        Window window = dialog.getWindow();
        if ( window == null )
        {
            // dialog window is not available, cannot apply margins
            return dialog;
        }
        Context context = dialog.getContext();
    
        // set dialog to fullscreen
        RelativeLayout root = new RelativeLayout( context );
        root.setLayoutParams( new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) );
        dialog.requestWindowFeature( Window.FEATURE_NO_TITLE );
        dialog.setContentView( root );
        // set background to get rid of additional margins
        window.setBackgroundDrawable( new ColorDrawable( Color.WHITE ) );
    
        // apply left and top margin directly
        window.setGravity( Gravity.LEFT | Gravity.TOP );
        LayoutParams attributes = window.getAttributes();
        attributes.x = marginLeft;
        attributes.y = marginTop;
        window.setAttributes( attributes );
    
        // set right and bottom margin implicitly by calculating width and height of dialog
        Point displaySize = getDisplayDimensions( context );
        int width = displaySize.x - marginLeft - marginRight;
        int height = displaySize.y - marginTop - marginBottom;
        window.setLayout( width, height );
    
        return dialog;
    }
    

    Here are the helper methods I used:

    @NonNull
    public static Point getDisplayDimensions( Context context )
    {
        WindowManager wm = ( WindowManager ) context.getSystemService( Context.WINDOW_SERVICE );
        Display display = wm.getDefaultDisplay();
    
        DisplayMetrics metrics = new DisplayMetrics();
        display.getMetrics( metrics );
        int screenWidth = metrics.widthPixels;
        int screenHeight = metrics.heightPixels;
    
        // find out if status bar has already been subtracted from screenHeight
        display.getRealMetrics( metrics );
        int physicalHeight = metrics.heightPixels;
        int statusBarHeight = getStatusBarHeight( context );
        int navigationBarHeight = getNavigationBarHeight( context );
        int heightDelta = physicalHeight - screenHeight;
        if ( heightDelta == 0 || heightDelta == navigationBarHeight )
        {
            screenHeight -= statusBarHeight;
        }
    
        return new Point( screenWidth, screenHeight );
    }
    
    public static int getStatusBarHeight( Context context )
    {
        Resources resources = context.getResources();
        int resourceId = resources.getIdentifier( "status_bar_height", "dimen", "android" );
        return ( resourceId > 0 ) ? resources.getDimensionPixelSize( resourceId ) : 0;
    }
    
    public static int getNavigationBarHeight( Context context )
    {
        Resources resources = context.getResources();
        int resourceId = resources.getIdentifier( "navigation_bar_height", "dimen", "android" );
        return ( resourceId > 0 ) ? resources.getDimensionPixelSize( resourceId ) : 0;
    }
    

    The helper methods are explained in another of my SO answers.

    This Gist contains an extended versions that supports immersve mode too.

    0 讨论(0)
  • 2020-12-16 17:49

    You can create a style for your dialog and put margins there.

    For example:

    <style name="custom_style_dialog"> 
        <item name="android:layout_marginStart">16dp</item>
        <item name="android:layout_marginEnd">16dp</item>
    </style>
    

    Then, in your dialog class:

    class CountryDialog(
        context: Context
    ) : Dialog(context, R.style.custom_style_dialog) {
    
      //your code here
    }
    
    0 讨论(0)
  • 2020-12-16 17:53

    I did a similar smiley dialog. I extend dialog

    public class SmileCustomDialog extends Dialog {
    Context mcontext;
    GridView mGridview;
    
    public GridView getGridview() {
        return mGridview;
    }
    
    public SmileCustomDialog(final Context context) {
        super(context, R.style.SlideFromBottomDialog);
        this.mcontext = context;
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.emocategorydialog, null);
        mGridview = (GridView) v.findViewById(R.id.emogrid);
        mGridview.setSelector(new ColorDrawable(Color.TRANSPARENT));
    
        ImageAdapter mAdapter = new ImageAdapter(mcontext);
        mGridview.setAdapter(mAdapter);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.setContentView(v);
    
        WindowManager.LayoutParams params = this.getWindow().getAttributes();
        this.setCanceledOnTouchOutside(true);
        params.y = -100;
        this.getWindow().setAttributes(params);
    
    }
    
    }
    

    But the essential is

    WindowManager.LayoutParams params = yourDialog.getWindow().getAttributes(); // change this to your dialog.
    
    params.y = -100; // Here is the param to set your dialog position. Same with params.x
            yourDialog.getWindow().setAttributes(params);
    

    Just add this before your show your dialog.

    0 讨论(0)
  • 2020-12-16 17:56
    View view = layoutInflater.inflate(R.layout.dialog_layout, null);
            AlertDialog infoDialog = new AlertDialog.Builder(this)
            .setView(view)  
            .create();
            Window window =infoDialog.getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND );
            WindowManager.LayoutParams wlp = window.getAttributes();
            wlp.gravity = Gravity.BOTTOM;
            wlp.dimAmount=(float) 0.0;
            //wlp.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND ;
    
            window.setAttributes(wlp);
            infoDialog.show();
    

    Change gravity to bottom

    0 讨论(0)
提交回复
热议问题