Как удалить границу из диалогового окна?

#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 , и он будет работать как шарм.