2011-11-08 13 views
20

Ho un'attività che è mostrato in una finestra:Come rimuovere il bordo dalla finestra di dialogo?

Per rimuovere bordo e gli angoli arrotondati, i provato questo:

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

Il confine è andato , ma purtroppo anche il margine attorno al dialogo.

risposta

36

Il bordo, gli angoli arrotondati e il margine sono definiti da android:windowBackground. (Parametro android:windowFrame è già impostato per @null in Theme.Dialog stile, quindi impostandolo a @null ha di nuovo alcun effetto.)

Al fine di rimuovere il bordo e angoli arrotondati che si deve cambiare il android:windowBackground in modo appropriato. Lo stile Theme.Dialog lo imposta su . Che è un disegnabile 9-patch che assomiglia a questo (questa è la versione hdpi):

enter image description here

Come si può vedere il png 9-patch definisce il margine, di frontiera e tondi angoli del tema finestra . Per rimuovere il bordo e gli angoli arrotondati devi creare un drawable appropriato. Se vuoi mantenere il gradiente di ombreggiatura devi creare un set di nuovi drawable a 9 patch (un drawable per ogni dpi). Se non hai bisogno del gradiente di ombreggiatura, puoi creare un shape drawable.

Lo stile richiesto è quindi:

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

Grazie mille! Non ero a conoscenza del fatto che l'immagine di sfondo definisce anche il margine. – timoschloesser

+0

plz, puoi mandarmi questa immagine a 9 patch provo a modificarla ma senza speranza, quando elimino le linee nere anch'io perdo l'effetto ombra. –

+0

L'immagine a 9 patch proviene da fonti Android. Le linee nere in drawable a 9 patch ci sono per un motivo, leggi di più sulle immagini con 9 patch [qui] (http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch). – Tomik

1

ho giocato un po 'con altre possibilità, ma utilizzando una patch 9 con margini fissi e scoperto che lo strato-list drawable sta permettendo di definire offset, quindi margini intorno alle sue drawable chiusi, quindi questo ha funzionato per me:

<?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> 

e quindi è possibile utilizzare questo come il "android: windowBackground":

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

senza creare un disegnabile sfondo personalizzato e l'aggiunta di uno stile speciale basta aggiungere una riga al codice:

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

soluzione elegante. Ho impostato la risorsa drawable su un drawable personalizzato che ho creato invece che trasparente. Grazie – BLOB

+0

Grazie. Bella soluzione – Dipali

+0

Soluzione piacevole se non è necessario utilizzarlo in classi multiple. – CiDsTaR

0

Un'altra opzione

Resources \ Valori \ styles.xml

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

dove

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

Queste dichiarazioni sono tratti dalla seguente frammento:

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"); 
} 
Problemi correlati