2011-11-08 41 views
20

Tôi có một hoạt động đó được thể hiện trong một hộp thoại:Làm cách nào để xóa đường viền khỏi Hộp thoại?

Để loại bỏ biên giới và góc tròn, tôi đã cố gắng này:

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

Biên giới là biến mất , nhưng thật đáng buồn cũng là lề xung quanh hộp thoại.

Trả lời

36

Đường viền, góc tròn và lề đều được xác định bởi android:windowBackground. (Parameter android:windowFrame đã được thiết lập để @null trong Theme.Dialog phong cách, do đó đặt nó vào @null lại không có tác dụng.)

Để loại bỏ các biên giới và các góc tròn, bạn phải thay đổi android:windowBackground một cách thích hợp. Kiểu Theme.Dialog đặt nó thành @android:drawable/panel_background. Mà là một drawable 9 vá trông như thế này (cái này là phiên bản hdpi):

enter image description here

Như bạn có thể thấy png 9 vá xác định góc lề, biên giới và tròn của theme thoại . Để loại bỏ đường viền và các góc tròn, bạn phải tạo một hình vẽ thích hợp. Nếu bạn muốn giữ lại gradient bóng, bạn phải tạo một tập hợp các bản vẽ 9 bản vá mới (một drawable cho mỗi dpi). Nếu bạn không cần gradient bóng, bạn có thể tạo một shape drawable.

Phong cách yêu cầu là sau đó:

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

Cảm ơn rất nhiều! Tôi không biết rằng hình nền cũng xác định lề. – timoschloesser

+0

plz, bạn có thể gửi cho tôi hình ảnh 9-vá này không, tôi cố gắng sửa đổi nó nhưng không có hy vọng, khi tôi deleed các đường màu đen tôi cũng mất hiệu ứng đổ bóng. –

+0

Hình ảnh 9-bit là từ các nguồn Android. Các đường màu đen trong bản vá 9 bản có thể có lý do, đọc thêm về hình ảnh 9-bit [ở đây] (http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch). – Tomik

1

tôi đã chơi xung quanh một chút với những khả năng khác nhưng sử dụng một bản vá 9 với lợi nhuận cố định và phát hiện ra rằng lớp-list drawable được cho phép để xác định hiệu số, do đó lợi nhuận xung quanh drawables kèm của nó, vì vậy đây làm việc cho tôi:

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

và sau đó bạn có thể sử dụng như là "android: windowBackground":

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

Nếu không tạo ra một drawable nền tùy chỉnh và thêm một phong cách đặc biệt chỉ cần thêm một dòng vào mã của bạn:

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

giải pháp thanh lịch. Tôi thiết lập các tài nguyên drawable để tùy chỉnh drawable tôi tạo ra thay vì minh bạch mặc dù. Thanx – BLOB

+0

Cảm ơn. Giải pháp tốt. – Dipali

+0

Giải pháp tuyệt vời nếu không phải sử dụng nó trong các lớp bội số. – CiDsTaR

0

Một lựa chọn khác

Resources \ Values ​​\ styles.xml

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

nơi

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

Các báo cáo này được trích từ đoạn sau:

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); 
    } 
} 

Cách sử dụng

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"); 
} 
Các vấn đề liên quan