2011-11-08 25 views
20

tengo una actividad que se muestra en un cuadro de diálogo:¿Cómo eliminar el borde del diálogo?

el fin de eliminar frontera y esquinas redondeadas, i intentado esto:

<resources> 
    <style name="ActivityDialog" parent="@android:style/Theme.Dialog"> 
    <item name="android:windowBackground">@null</item> 
    <item name="android:windowFrame">@null</item> 
</style> 

La frontera se ha ido , pero lamentablemente también el margen alrededor del diálogo.

Respuesta

36

El borde, las esquinas redondeadas y el margen están definidos por android:windowBackground. (Parámetro android:windowFrame ya está establecido en @null en Theme.Dialog estilo, por lo tanto, estableciéndolo en @null de nuevo no tiene ningún efecto.)

Con el fin de eliminar el borde y esquinas redondas que tiene que cambiar la android:windowBackground adecuadamente. El estilo Theme.Dialog lo establece en @android:drawable/panel_background. ¿Qué es una estirable 9-parche que se parece a esto (ésta es la versión IPAP):

enter image description here

Como se puede ver el png 9-patch define las esquinas de margen, fronterizos y redondos del tema de diálogo . Para eliminar el borde y las esquinas redondeadas, debe crear un dibujante apropiado. Si desea mantener el gradiente de sombra, debe crear un conjunto de nuevos patrones de 9 parches (uno dibujable para cada ppp). Si no necesita el degradado de sombra, puede crear un shape drawable.

El estilo requerido es entonces:

<style name="ActivityDialog" parent="@android:style/Theme.Dialog">  
    <item name="android:windowBackground">@drawable/my_custom_dialog_background</item>    
</style> 
+0

Muchas gracias! No sabía que la imagen de fondo también define el margen. – timoschloesser

+0

por favor, ¿me pueden enviar esta imagen de 9 parches que intento modificar pero sin esperanza, cuando eliminé las líneas negras también pierdo el efecto de sombra. –

+0

La imagen de 9 parches proviene de fuentes de Android. Las líneas negras en 9-parches dibujables están ahí por alguna razón, lea más sobre las imágenes de 9 parches [aquí] (http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch) – Tomik

1

I jugaron un poco con otras posibilidades, pero utilizando un parche 9 con márgenes fijos y descubrió que la capa de lista estirable está permitiendo definir offsets, por lo tanto, los márgenes en torno a sus dibujables cerrados, así que esto funcionó para mí:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item 
     android:drawable="@drawable/my_custom_background" 
     android:top="5dp" android:bottom="5dp" android:left="5dp" android:right="5dp"> 
    </item> 

</layer-list> 

y entonces usted puede utilizar esto como el "android: windowBackground":

<style name="ActivityDialog" parent="@android:style/Theme.Dialog">  
    <item name="android:windowBackground">@drawable/my_custom_layer_background</item>    
</style> 
66

sin crear un fondo personalizado estirable y la adición de un estilo especial sólo tiene que añadir una línea a su código:

dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); 
+0

solución elegante. Sin embargo, establecí el recurso dibujable en dibujable personalizado que creé en lugar de transparente. Gracias – BLOB

+0

Gracias. Buena solución. – Dipali

+0

Buena solución si no tiene que usarla en múltiples clases. – CiDsTaR

0

Otra opción

recursos \ Valores \ styles.xml

<style name="MessageDialog" parent="android:Theme.Holo.Light.Dialog"> 
    <item name="android:windowBackground">@android:color/transparent</item> 
</style> 

donde

AlertDialog.Builder builder = new AlertDialog.Builder(Activity, Resource.Style.MessageDialog);    

Estas declaraciones se han extraído del siguiente fragmento:

public class MessageAlertDialog : DialogFragment, IDialogInterfaceOnClickListener 
{ 
    private const string DIALOG_TITLE = "dialogTitle"; 
    private const string MESSAGE_TEXT = "messageText"; 
    private const string MESSAGE_RESOURCE_ID = "messageResourceId"; 

    private string _dialogTitle; 
    private string _messageText; 
    private int _messageResourceId; 

    public EventHandler OkClickEventHandler { get; set; } 

    public static MessageAlertDialog NewInstance(string messageText) 
    { 
     MessageAlertDialog dialogFragment = new MessageAlertDialog(); 

     Bundle args = new Bundle(); 
     args.PutString(MESSAGE_TEXT, messageText); 

     dialogFragment.Arguments = args; 

     return dialogFragment; 
    } 

    public static MessageAlertDialog NewInstance(string dialogTitle, string messageText) 
    { 
     MessageAlertDialog dialogFragment = new MessageAlertDialog(); 

     Bundle args = new Bundle(); 
     args.PutString(DIALOG_TITLE, dialogTitle); 
     args.PutString(MESSAGE_TEXT, messageText); 

     dialogFragment.Arguments = args; 

     return dialogFragment; 
    } 

    public static MessageAlertDialog NewInstance(int messageResourceId) 
    { 
     MessageAlertDialog dialogFragment = new MessageAlertDialog(); 

     Bundle args = new Bundle(); 
     args.PutInt(MESSAGE_RESOURCE_ID, messageResourceId); 

     dialogFragment.Arguments = args; 

     return dialogFragment; 
    }   

    public override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 

     _dialogTitle = Arguments.GetString(DIALOG_TITLE); 
     _messageText = Arguments.GetString(MESSAGE_TEXT); 
     _messageResourceId = Arguments.GetInt(MESSAGE_RESOURCE_ID); 
    } 

    public override Dialog OnCreateDialog(Bundle savedInstanceState) 
    { 
     base.OnCreateDialog(savedInstanceState); 

     AlertDialog.Builder builder = new AlertDialog.Builder(Activity, Resource.Style.MessageDialog);    

     if (_dialogTitle != null) 
     { 
      builder.SetTitle(_dialogTitle); 
     } 

     if (_messageText != null) 
     { 
      builder.SetMessage(_messageText); 
     } 
     else 
     { 
      View messageView = GetMessageView(); 
      if (messageView != null) 
      { 
       builder.SetView(messageView); 
      } 
     } 

     builder.SetPositiveButton("OK", this); 
       //.SetCancelable(false);    

     this.Cancelable = false; 
     AlertDialog dialog = builder.Create(); 
     dialog.SetCanceledOnTouchOutside(false); 
     //dialog.Window.SetBackgroundDrawableResource(Android.Resource.Color.Transparent); 

     return dialog;    
    } 

    private View GetMessageView() 
    { 
     if (_messageResourceId != 0) 
     { 
      View messageView = Activity.LayoutInflater.Inflate(_messageResourceId, null); 

      return messageView; 
     } 

     return null; 
    } 

    void IDialogInterfaceOnClickListener.OnClick(IDialogInterface di, int i) 
    { 
     OkClickEventHandler?.Invoke(this, null); 
    } 
} 

Uso

public static void ShowMessageAlertDialog(FragmentManager fragmentManager, string dialogTitle, string messageText, EventHandler okClickEventHandler) 
{ 
    MessageAlertDialog msgAlertDialog = MessageAlertDialog.NewInstance(dialogTitle, messageText); 
    msgAlertDialog.OkClickEventHandler += okClickEventHandler; 

    msgAlertDialog.Show(fragmentManager, "message_alert_dialog"); 
} 
Cuestiones relacionadas