#android
#Android
Вопрос:
У меня есть действие, которое отображается в диалоговом окне:
Чтобы удалить границу и закругленные углы, я попробовал это:
<resources>
<style name="ActivityDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@null</item>
<item name="android:windowFrame">@null</item>
</style>
Граница исчезла, но, к сожалению, также и поле вокруг диалогового окна.
Ответ №1:
Без создания пользовательского фона, который можно отрисовывать, и добавления специального стиля просто добавьте одну строку в свой код:
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
Ответ №2:
Граница, закругленные углы и поля определяются android:windowBackground
. (Для параметра android:windowFrame
уже установлено значение @null
in Theme.Dialog
style, поэтому его повторное значение @null
не имеет никакого эффекта.)
Для того, чтобы удалить границу и закругленные углы, вы должны изменить android:windowBackground
соответствующим образом. Theme.Dialog
Стиль устанавливает ее в @android:drawable/panel_background
. Какой из 9-ти патчей можно нарисовать, который выглядит следующим образом (это версия hdpi):
Как вы можете видеть, 9-patch png определяет поля, границы и закругленные углы темы диалогового окна. Чтобы удалить границу и закругленные углы, вы должны создать соответствующий чертеж. Если вы хотите сохранить градиент тени, вам нужно создать набор новых рисунков с 9 патчами (по одному для каждого dpi). Если вам не нужен градиент тени, вы можете создать форму, которую можно рисовать.
Требуемый стиль тогда:
<style name="ActivityDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@drawable/my_custom_dialog_background</item>
</style>
Комментарии:
1. Большое спасибо! Я не знал, что фоновое изображение также определяет поле.
2. пожалуйста, не могли бы вы прислать мне это изображение с 9 исправлениями, я пытаюсь изменить его, но без надежды, когда я удаляю черные линии, я также теряю эффект тени.
3. Изображение 9-го патча взято из исходных текстов Android. Черные линии в 9-patch drawable существуют не просто так, подробнее об изображениях 9-patch здесь .
4. @Tomik: Для ProgressDialog это устанавливает изображение под диалогом, а не само диалоговое окно. В частности, граница сохраняется.
Ответ №3:
Я немного поиграл с другими возможностями, но использовал патч 9 с фиксированными полями и обнаружил, что layer-list drawable позволяет определять смещения, следовательно, поля вокруг вложенных в него объектов рисования, так что у меня это сработало:
<?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>
и затем вы можете использовать это как «android: windowBackground»:
<style name="ActivityDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@drawable/my_custom_layer_background</item>
</style>
Ответ №4:
Другой вариант
ResourcesValuesstyles.xml
<style name="MessageDialog" parent="android:Theme.Holo.Light.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
</style>
где
AlertDialog.Builder builder = new AlertDialog.Builder(Activity, Resource.Style.MessageDialog);
Эти инструкции взяты из следующего фрагмента:
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);
}
}
Использование
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");
}
Ответ №5:
Другим решением этой проблемы является использование android.support.v7.app.AlerDialog
вместо android.app.AlertDialog
. Это самое простое и экономичное по времени решение. Создайте пользовательский вид в макете, а затем используйте его с классом вашего support
пакета AlertDialogBuilder
, и он будет работать как шарм.