poner online margen marcos marco como celular bordes borde android dialog

android - online - ¿Cómo establecer los márgenes a un diálogo personalizado?



como poner margen en word en el celular (7)

1) cambie la altura de diseño padre principal match_content como se match_content a continuación:

<style name="dialogTheme" parent="Base.Theme.AppCompat.Light.Dialog.Alert"/>

2) ahora agrega estilo a tus styles.xml

Dialog dialog = new Dialog(DayActivity.this, R.style.dialogTheme); dialog.setContentView(R.layout.dialog_custom_layout); dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); dialog.show();

3) ahora agregue el código siguiente para mostrar el diálogo:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content"> <LinearLayout android:layout_margin="22dp" android:orientation="vertical" android:layout_width="220dp" android:layout_height="wrap_content"> ... Buttons, TextViews, etc </LinearLayout> </LinearLayout>

¿Alguien sabe cómo puedo establecer los márgenes a un diálogo personalizado? Pregunto porque tengo un cuadro de diálogo personalizado, pero cuando se muestra se extiende para llenar el elemento primario, aunque establecí WRAP_CONTENT explícitamente en los parámetros de diseño.

Básicamente, el diálogo contiene una vista de lista cuyos elementos deben desplazarse hacia abajo, cuando los elementos son 1, por ejemplo, no se estira, pero cuando se agregan más elementos, el cuadro de diálogo ocupa toda la pantalla.

¿Alguna sugerencia? He intentado todas las combinaciones posibles de soluciones posibles sin lograr resultados satisfactorios

EDITAR: agregó el diseño del diálogo

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="50dip" android:orientation="vertical" android:layout_gravity="top|center"> <FrameLayout android:layout_width="fill_parent" android:layout_margin="5dip" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textSize="20sp" android:textColor="@color/black"/> <Button android:layout_height="32dip" android:layout_width="32dip" android:id="@+id/guide_dialog_cross_button" android:background="@drawable/button_cross_white"/> </FrameLayout> <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:fadingEdge="none" android:layout_margin="5dip"/> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5dip" /> </LinearLayout>


El margen no parece funcionar en el diseño personalizado para el diálogo, pero el relleno funciona. Intente configurar el relleno en el diseño lineal de nivel superior.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="4dp" android:paddingRight="4dp" >


Esta es una forma directa y programática de establecer la posición y el tamaño de mi diálogo con los márgenes.

DialogFragment mi enfoque para un DialogFragment aplicándolo en el método 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; }

Este es el método que aplica los márgenes al diálogo:

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

Aquí están los métodos de ayuda que utilicé:

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

Los métodos de ayuda se explican en otra de mis respuestas SO .

Este Gist contiene una versión extendida que también admite el modo inmersión.


Los márgenes no funcionan para los cuadros de diálogo, me imagino que la vista de ventana de nivel superior no es un tipo de diseño que admite márgenes. He visto publicaciones que dicen que los márgenes funcionarán cuando se definan como el estilo del cuadro de diálogo (en lugar de en el elemento de vista de nivel superior), pero esto tampoco parece funcionar.

Lo que debe hacer para evitar el problema es utilizar un inset insertable para su fondo de diálogo y ajustar cualquier relleno para tener en cuenta el recuadro adicional del fondo. En el siguiente ejemplo, simplemente estableceré los márgenes izquierdo y derecho.

Diálogo fondo dibujable:

<?xml version="1.0" encoding="utf-8"?> <!-- drawable is a reference to your ''real'' dialog background --> <!-- insetRight and insetLeft add the margins --> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/dialog_background" android:insetRight="10dp" android:insetLeft="10dp"> </inset>

Vista principal del cuadro de diálogo:

<?xml version="1.0" encoding="utf-8"?> <!-- paddingTop / paddingBottom padding for the dialog --> <!-- paddingLeft / paddingRight padding must add the additional inset space to be consistent --> <!-- background references the inset background drawable --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingTop="5dp" android:paddingBottom="5dp" android:paddingLeft="15dp" android:paddingRight="15dp" android:background="@drawable/dialog_background_inset"> <!-- ...the rest of the layout... -->

Es posible que también deba establecer el color de fondo del cuadro de diálogo como transparente. Agregue un recurso de color como ese:

<color name="transparent">#00000000</color>

Y establezca el color de fondo de la ventana del diálogo en esto (nota: no puede asignar el color directamente, eclipse se quejará)

<style name="Dialog" parent="android:style/Theme.Dialog"> <item name="android:windowBackground">@color/transparent</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item> </style>

Este estilo se debe pasar al constructor de su diálogo como el argumento del theme , como en el new Dialog(context, R.style.Dialog);


Tuve el mismo problema y lo resolví configurando el fondo de la ventana en un InsetDrawable:

AlertDialog.Builder builder = new AlertDialog.Builder(context); ... ... AlertDialog dialog = builder.create(); ColorDrawable back = new ColorDrawable(Color.TRANSPARENT); InsetDrawable inset = new InsetDrawable(back, 20); dialog.getWindow().setBackgroundDrawable(inset); dialog.show();

En este caso, el cuadro de diálogo aparecerá con un margen de 20 en todos los bordes.


Una solución alternativa se puede hacer así:

dialog.getWindow().getAttributes().height = (int) (getDeviceMetrics(context).heightPixels*0.8);

`Método getDeviceMetrics :

public static DisplayMetrics getDeviceMetrics(Context context) { DisplayMetrics metrics = new DisplayMetrics(); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); display.getMetrics(metrics); return metrics; }


Una solución simple que funcionó para mí fue envolver mi Vista completa en otra, y establecer el margen al cual ahora es la Vista interna.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="match_content" android:layout_margin="50dip" android:orientation="vertical" android:layout_gravity="top|center">

Obs: eso funcionó cuando quería márgenes dentro de mi AlertDialog. No con respecto a la pantalla.