如何在对话框中设置边距

我在我的Andorid应用程序中使用了Dialog作为展示广告。但是我必须从buttom显示大约50dp的Dialog ,所以我认为我们应该设置Dialog Gravity buttom并设置它的button边距50dp。但是我无法在Dialog使用边距所以请build议我如何解决这个问题。

XML:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/popup_element" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/dialogback" android:orientation="vertical" > <WebView android:id="@+id/webView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

Java的:

 final Dialog dialog = new Dialog(this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0)); LayoutInflater inflator = (LayoutInflater) getApplicationContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflator.inflate(R.layout.ad, null, false); dialog.setContentView(view); dialog.getWindow().setGravity(Gravity.BOTTOM); dialog.setCancelable(true); WebView webView = (WebView) dialog.findViewById(R.id.webView); webView.loadUrl(""); webView.setWebViewClient(new MyWebViewClient()); webView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dialog.dismiss(); } }); dialog.show(); 

Solutions Collecting From Web of "如何在对话框中设置边距"

我做了一个类似的笑脸对话框。 我扩展对话框

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

但关键是

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

只需在显示对话框之前添加这个。

WindowManager.LayoutParams:
public int x:X position …使用LEFT或START或RIGHT或END时,它会提供给定边的偏移量
public int y:Y position …当使用TOP或BOTTOM时,它会提供给定边的偏移量
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#x
从而:

 最终对话框=新的对话框(上下文);
     // ...
     //例如顶部+右边距:
     dialog.getWindow()setGravity(Gravity.TOP | Gravity.RIGHT)。
     WindowManager.LayoutParams layoutParams = dialog.getWindow()。getAttributes();
     layoutParams.x = 100;  //右边距
     layoutParams.y = 170;  //上边距
     dialog.getWindow()setAttributes(的LayoutParams)。
     //例如底部+左边距:
     。dialog.getWindow()setGravity(Gravity.BOTTOM | Gravity.LEFT);
     WindowManager.LayoutParams layoutParams = dialog.getWindow()。getAttributes();
     layoutParams.x = 100;  //左边距
     layoutParams.y = 170;  //底部边距
     dialog.getWindow()setAttributes(的LayoutParams)。 

// etc.

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

改变重力到底部

这是一个设置所有四个边界而不必关心重力的方法。

我通过在onCreateDialog方法中应用它来testingDialogFragment的方法:

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

这是将边距应用于对话框的方法:

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

这里是我使用的帮手方法:

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

辅助方法在我的另一个答案中解释。

这个Gist包含一个支持沉浸模式的扩展版本。