2011-09-01 58 views
18

Tôi có một hoạt động chính nơi người dùng có thể thay đổi (thông qua tùy chọn) màu nền thành màu yêu thích của họ. Vấn đề của tôi là tôi không thể thay đổi màu nền của bất kỳ hộp thoại tùy chỉnh nào.Làm thế nào để thay đổi màu nền của hộp thoại theo chương trình?

câu trả lời khác trong stack overflow đề nghị:

(a) overiding the default theme với màu ưa thích. Tôi không nghĩ là một giải pháp phù hợp trong trường hợp này vì tôi biết việc thay đổi chủ đề trong thời gian chạy không được khuyến nghị.

(b) Changing in styles.xml (không phù hợp trong trường hợp này như tôi không thể thay đổi tại thời gian chạy)

(c) Overriding the AlertBuilder class (nhưng điều này mang lại màu hộp thoại cảnh báo toàn bộ)

này gần nhất tôi đã đi để thay đổi màu sắc, hãy xóa tiêu đề trình tạo cảnh báo và đặt nền của chế độ xem tùy chỉnh thành màu yêu thích (ví dụ :.p.pink). Thật không may, điều này cho một dải xấu xí ở trên cùng và dưới cùng của hộp thoại.

Mã được bao gồm sau hình ảnh, đề xuất về cách thay đổi nền của hộp thoại sẽ được đánh giá cao.

Dialog appearance

Mã cho sự xuất hiện mặc định

protected Dialog onCreateDialog(int dialogId) { 
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final AlertDialog.Builder builder = new AlertDialog.Builder(this); 


     final View viewMessEdit = inflater.inflate(R.layout.example,(ViewGroup) findViewById(R.id.dialog_mess_edit_root)); 
       builder.setView(viewMessEdit); 
     builder.setTitle("Alert builder's title"); 
} 

Mã cho việc thay đổi màu thoại tùy chỉnh quan điểm nền (và chức danh những người xây dựng của Alert được lấy ra)

protected Dialog onCreateDialog(int dialogId) { 
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final AlertDialog.Builder builder = new AlertDialog.Builder(this); 


     final View viewMessEdit = inflater.inflate(R.layout.example,(ViewGroup) findViewById(R.id.dialog_mess_edit_root)); 
       builder.setView(viewMessEdit); 
       viewMessEdit.setBackgroundResource(R.color.pink_dark); 

} 
+0

bạn có thể hoàn thành hộp thoại này làm hình ảnh của mình không? nếu có, bạn có thể chia sẻ không? – pengwang

Trả lời

8

Tôi cũng gặp phải vấn đề tương tự. Và cách duy nhất để giải quyết nó là mở rộng phiên bản bố cục của riêng tôi. Tôi thấy rằng trong trường hợp của bạn nó là một AlertDialog. Những gì tôi khuyên bạn nên làm, là tạo ra một lớp duy nhất, đó là AlertDialog tùy chỉnh của bạn và tạo ra một bố trí cho điều này, và sau đó bạn thổi phồng này.

Đây là bài đăng đã giúp tôi rất nhiều. http://blog.androgames.net/10/custom-android-dialog/

Tôi đã theo dõi bài đăng này và giải quyết sự cố của mình bằng cách tùy chỉnh hộp thoại.

Xin vui lòng, nếu bạn có nhiều nghi ngờ, hãy cho tôi biết.

Cảm ơn.

+1

Cảm ơn bạn đã liên kết tới bài đăng androgames. Nó được viết rõ ràng và được nhận xét tốt. Đây là bài đăng trên blog có liên quan. http://dtmilano.blogspot.com/2010/01/android-ui-colored-dialogs.html – Mel

+15

@rogcg liên kết không hoạt động. – Deepak

+0

Tôi đã cập nhật liên kết đến phiên bản được lưu trong bộ nhớ cache bằng WayBack Machine. – kabuko

17

Tôi đã tìm thấy một giải pháp quy tắc!

d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground); 

Nó hoạt động cho tôi với hộp thoại thông thường. Nhưng tôi không biết nếu nó hoạt động trên AlertDialog.

+2

Tôi chỉ thử nó, nó không. Tôi đã cố gắng với một màu đồng nhất và màu sắc của tôi xuất hiện thay vì bóng của alertdialog trong nền. – soger

+0

@ user3696814 Vâng nó hoạt động trong AlertDialog. – CopsOnRoad

3

Tôi đã tìm thấy một hack, mà không tạo bố cục tùy chỉnh, bạn có thể tạo nhiều thiết kế bằng cách chơi với một số thuộc tính của AlertDialog.

gì bạn phải làm:

Khi AlertDialog xuất hiện trên màn hình của bạn, OnShowListener được gọi. Vì vậy, bằng cách thêm dialog.setOnShowListener(this), bạn sẽ có thể tùy chỉnh AlertDialog của mình.

Code:

// Create AlertDialog 
AlertDialog.Builder adb = new AlertDialog.Builder(context1); 
    adb.setTitle(context1.getString(R.string.app_name)) 
    .setMessage(message) 
    .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

     } 
}); 
AlertDialog dialog = adb.create(); 

// Make some UI changes for AlertDialog 
dialog.setOnShowListener(new DialogInterface.OnShowListener() { 
    @Override 
    public void onShow(final DialogInterface dialog) { 

     // Add or create your own background drawable for AlertDialog window 
     Window view = ((AlertDialog)dialog).getWindow(); 
     view.setBackgroundDrawableResource(R.drawable.your_drawable); 

     // Customize POSITIVE, NEGATIVE and NEUTRAL buttons. 
     Button positiveButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_POSITIVE); 
     positiveButton.setTextColor(context1.getResources().getColor(R.color.primaryColor)); 
     positiveButton.setTypeface(Typeface.DEFAULT_BOLD); 
     positiveButton.invalidate(); 

     Button negativeButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEGATIVE); 
     negativeButton.setTextColor(context1.getResources().getColor(R.color.primaryColor)); 
     negativeButton.setTypeface(Typeface.DEFAULT_BOLD); 
     negativeButton.invalidate(); 

     Button neutralButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEUTRAL); 
     neutralButton.setTextColor(context1.getResources().getColor(R.color.primaryColor)); 
     neutralButton.setTypeface(Typeface.DEFAULT_BOLD); 
     neutralButton.invalidate(); 
    } 
}); 
+0

như một sự quyến rũ) thx –

1

Các giải pháp đề nghị

d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground); 

Đừng làm việc tốt (thử nghiệm trong 6.0) vì nó làm thay đổi bóng thoại

Đây là của tôi giải pháp:

public static void changeDialogBackground(final Dialog dialog,final int resId) { 
    dialog.getWindow().getDecorView().setBackgroundResource(resId); 
    dialog.setOnShowListener(new DialogInterface.OnShowListener() { 
     @Override 
     public void onShow(final DialogInterface dialog) { 
      Window window = ((AlertDialog)dialog).getWindow(); 
      window.getDecorView().setBackgroundResource(resId); 
     } 
    }); 
} 
3

màu nền Dialogue

dialog.getWindow().setBackgroundDrawableResource(R.color.glassblack); 

thực sự làm việc tốt cho tôi.

Các vấn đề liên quan