android - quitar - ¿Cómo eliminar el borde de diálogo?
quitar boton flotante android (4)
El borde, las esquinas redondeadas y el margen están definidos por android:windowBackground
. (El parámetro android:windowFrame
ya está configurado como @null
en el estilo Theme.Dialog
, por lo tanto, configurarlo en @null
nuevamente no tiene efecto)
Para eliminar los bordes y las esquinas redondeadas, debe cambiar el android:windowBackground
adecuada. El estilo Theme.Dialog
establece en @android:drawable/panel_background
. Que es un dibujable de 9 parches que se ve así (esta es la versión hdpi):
Como puede ver, el png de 9 parches define el margen, el borde y las esquinas redondas del tema del diálogo. Para eliminar el borde y las esquinas redondas, debe crear un dibujo adecuado. Si desea mantener el gradiente de sombra, debe crear un conjunto de nuevos dibujables de 9 parches (uno dibujable por cada dpi). Si no necesita el degradado de sombra, puede crear una forma dibujable .
El estilo requerido es entonces:
<style name="ActivityDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@drawable/my_custom_dialog_background</item>
</style>
Tengo una actividad que se muestra en un diálogo:
Para eliminar bordes y esquinas redondeadas, probé esto:
<resources>
<style name="ActivityDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@null</item>
<item name="android:windowFrame">@null</item>
</style>
El borde se ha ido, pero lamentablemente también el margen alrededor del diálogo.
Jugué un poco con otras posibilidades, pero al usar un parche 9 con márgenes fijos, descubrí que la lista de capas que se puede dibujar permite definir compensaciones, por lo tanto, márgenes alrededor de sus elementos dibujables incluidos, 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 luego puedes usar esto como "android: windowBackground":
<style name="ActivityDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@drawable/my_custom_layer_background</item>
</style>
Otra opción
Recursos / Valores / estilos.xml
<style name="MessageDialog" parent="android:Theme.Holo.Light.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
</style>
dónde
AlertDialog.Builder builder = new AlertDialog.Builder(Activity, Resource.Style.MessageDialog);
Estas declaraciones están extraídas del siguiente fragmento de código:
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");
}
Sin crear un dibujo de fondo personalizado y agregar un estilo especial, solo agregue una línea a su código:
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);