我已经在我的Andorid应用中使用了Dialog
来展示广告。但是我必须在buttom上显示这个Dialog
大约50dp的顶部所以我认为我们应该设置Dialog
Gravity buttom并设置它的余量为50dp。但是我无法在Dialog
中使用保证金。所以请建议我如何解决这个问题。
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>
爪哇:
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();
答案 0 :(得分:19)
我做了类似的笑脸对话。我扩展了对话框
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);
只需在显示对话框之前添加此内容。
答案 1 :(得分:15)
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)
从而:
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.
答案 2 :(得分:3)
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();
将重力变为底部
答案 3 :(得分:2)
这是一种设置所有四个边距而无需关注重力的方法。
我通过DialogFragment
方法应用onCreateDialog
来测试我的方法:
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;
}
辅助方法在我的另一个SO answers中解释。
此Gist包含支持沉浸模式的扩展版本。
答案 4 :(得分:2)
您可以为对话框创建样式并在其中放置边距。
例如:
<style name="custom_style_dialog">
<item name="android:layout_marginStart">16dp</item>
<item name="android:layout_marginEnd">16dp</item>
</style>
然后,在您的对话框类中:
class CountryDialog(
context: Context
) : Dialog(context, R.style.custom_style_dialog) {
//your code here
}
答案 5 :(得分:0)
嗯,最适合我的方法是将对话框视图包装在FrameLayout中并添加填充,然后将onClickListener设置为“关闭”对话框。像这样:
<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() }
答案 6 :(得分:0)
另一种方法是使用 InsetDrawable。您只需指定 insetLeft 和 insetRight 并将其应用为您的背景,如下所示:
inset_drawable.xml(在 drawable 文件夹中创建)
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/dialog_bg" <!-- this is simply a shape drawable with corners applied-->
android:insetLeft="30dp" <!-- specify your dimension -->
android:insetRight="30dp" />
your_layout.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/inset_drawable"
android:orientation="vertical" >
<WebView
android:id="@+id/webView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>