2012-11-01 51 views
8

我已經使用Dialog在我的Andorid app.But顯示廣告我都顯示此Dialog約50dp頂部從BUTTOM,所以我認爲我們應該設定Dialog重力BUTTOM並設置其BUTTOM margine 50dp.But我無法在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> 

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

回答

16

我做了一個類似的笑臉對話框。我延長對話框

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

如果我想從左側和右側設置加固,該怎麼辦。我試圖用pawt.x來做到這一點,但沒有工作。 –

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

變化重力底部

14

WindowManager.LayoutParams:
公衆詮釋X:X位置...當使用LEFT或START或RIGHT或結束它提供了一個從給定的邊緣
公共偏移INT Y:

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

這是一個應用程序:Y位置...當使用TOP或BOTTOM它提供了一個從給定的邊緣
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#x
從而抵消蟑螂設置所有四個邊緣,而不必關心重力。

我測試了我的一個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包含支持沉浸模式的擴展版本。