2010-03-26 32 views
14

Có ai biết cách ghi đè kiểu mặc định cho các nút AlertDialog không? Tôi đã xem xét các nguồn Android cho themesstyles và thử nghiệm với những thứ khác nhau nhưng tôi đã không thể tìm thấy một cách hoạt động.Kiểu nút trong AlertDialogs

Những gì tôi có bên dưới hoạt động để thay đổi hình nền, nhưng không làm bất cứ điều gì với các nút. myTheme được áp dụng cho toàn bộ <application> qua tệp kê khai. (Một số mục khác đã bị xóa để rõ ràng, nhưng chúng chỉ liên quan đến thanh tiêu đề.)

<style name="myTheme" parent="android:Theme"> 
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
    <item name="android:alertDialogStyle">@style/dialogAlertTheme</item> 
</style> 

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:fullDark">@drawable/dialog_loading_background</item> 
    <item name="android:topDark">@drawable/dialog_alert_top</item> 
    <item name="android:centerDark">@drawable/dialog_alert_center</item> 
    <item name="android:bottomDark">@drawable/dialog_alert_bottom</item> 
    <!-- this last line makes no difference to the buttons --> 
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
</style> 

Bất kỳ ý tưởng nào?

Trả lời

2

Tôi đoán bạn phải triển khai lớp học Dialog của riêng bạn.

+4

Hmm. Điều đó sẽ gây phiền nhiễu; việc thay đổi các nút Dialog không phải là một điều bất thường, vì bạn dễ dàng áp dụng kiểu nút cho các nút Hoạt động 'bình thường'. –

+0

Trong các hoạt động bình thường, bạn xác định bố cục của chế độ xem nội dung bằng xml. Hộp thoại thực hiện điều này cho bạn, vì vậy bạn không có quyền truy cập vào bố cục xml. Thực hiện hộp thoại của riêng bạn (có thể chỉ với một setContentView() gọi) cho phép bạn sử dụng một xml khác nhau và do đó phong cách khác nhau cho các nút. – MrSnowflake

+1

Làm thế nào bạn sẽ phân lớp AlertDialog để bạn có thể sử dụng AlertDialog.Builder với lớp con của bạn? –

23

Vì lý do của MrSnowflake không chính xác, tôi đang tự do đưa ra một câu trả lời khác.

Có gì đó sai với đánh dấu trong câu hỏi Steve Haley, và nó được trộn lên alertDialogStyle và alertDialogTheme, rất có thể vì thực tế rằng alertDialogTheme đã được giới thiệu lâu sau alertDialogStyle là xung quanh.

Vì vậy, ngay cả khi @android: style/Theme.Dialog.Alert có sẵn trên nền tảng Andoid của bạn, bạn vẫn không thể sử dụng sức mạnh biểu thức của nó bằng cách gắn một phiên bản trở lại vào chủ đề của riêng bạn trừ khi nền tảng Android của bạn hỗ trợ android: alertDialogTheme thuộc tính/mục cho chủ đề. (Có thể hoặc có thể không phải là trường hợp tồn tại các phiên bản Android không nhất quán như vậy, tôi không biết chắc chắn. Nhưng đánh dấu được sử dụng trong câu hỏi cho thấy nó có.)

Trong đánh dấu câu hỏi, phụ huynh = " @android: style/Theme.Dialog.Alert "sẽ không làm gì cả ngoại trừ việc tạo ảo tưởng rằng bạn đang tùy chỉnh chủ đề hộp thoại cảnh báo khi bạn thực sự chỉ tùy chỉnh kiểu hộp thoại cảnh báo.

Đây là cách đánh dấu sẽ như thế nào; không phải tất cả các phiên bản Android đều hỗ trợ tất cả các tính năng.

<style name="myTheme" parent="android:Theme"> 
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
    <item name="android:alertDialogStyle">@style/dialogAlertStyle</item> 
    <item name="android:alertDialogTheme">@style/dialogAlertTheme</item> 
</style> 

<style name="dialogAlertStyle" parent="@android:style/AlertDialog"> 
    <item name="android:fullDark">[...]</item> 
    [...] 
</style> 

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:windowBackground">[...]</item> 
    [...] 
</style> 

Tùy chỉnh phong cách hộp thoại cảnh báo đã được khoảng một thời gian khá lâu nhưng được giới hạn cung cấp (nền) drawables cho "fullDark", "topDark" vv

Tùy chỉnh chủ đề hộp thoại cảnh báo sẽ mở ra một phương pháp để cung cấp các thuộc tính như windowBackground, windowTitleStyle và như vậy, nhưng như đã nêu trước đó, bạn cần một phiên bản Android hỗ trợ thuộc tính/item alertDialogThem cho các chủ đề. Tôi không thể tìm ra chính xác khi nào điều này được giới thiệu nhưng nó chưa được Android 2.2 và Eclipse sẽ cho bạn biết ...

Tôi không có nguồn lực để xác nhận kết luận của MrSnowflake rằng không thể tạo kiểu hộp thoại cảnh báo các nút trong XML, nhưng trừ khi chúng ta đang đối mặt với một trong những khía cạnh hơi khó chịu của Android, nơi một tính năng thực sự bị thiếu, tôi thấy nó khó xảy ra.

Như một vấn đề của thực tế, những gì còn thiếu trong câu hỏi là phần phù hợp nhất trong lĩnh vực này, cụ thể là

<style name="customButtonStyle" /> 

để kết luận rằng nút hộp thoại cảnh báo không tuân theo Widget.Button chưa được chứng minh theo quan điểm của tôi.

Kết luận hợp nhất: Khả năng tạo kiểu hộp thoại cảnh báo độc lập với các tiện ích khác bị giới hạn trong Android nhưng trở nên mạnh mẽ hơn khi các phiên bản mới được cải thiện theo khía cạnh này.

1

Bạn có thể ghi đè lên "buttonBarButtonStyle" thay vì "buttonStyle" như thế này:

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:buttonBarButtonStyle">@style/customButtonStyle</item> 
</style> 
+0

yêu cầu API 11 hoặc cao hơn – Yar

+0

như thể bất cứ ai vẫn phát triển cho api 10 và thấp hơn .. –

+1

@TimCastelijns Tôi cảm thấy đó là điểm mấu chốt. Câu trả lời chất lượng sẽ cung cấp thông tin đó. Và trong thực tế, mọi người phải duy trì các ứng dụng tương thích ngược. –

1

tôi đã thực hiện một phương pháp như thế này sẽ thay đổi màu sắc nút mặc định và nền

public static void setDefaultColorTextForDialogButton(AlertDialog alertDialog, Resources r) { 
    Button b; 

    b= alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE); 
    if(b != null) { 
     b.setTextColor(r.getColor(R.color.default_text)); 
     b.setBackgroundColor(Color.WHITE); 
    } 
    b = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); 
    if(b != null) { 
     b.setTextColor(r.getColor(R.color.default_text)); 
     b.setBackgroundColor(Color.WHITE); 
    } 
    b = alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL); 
    if(b != null) { 
     b.setTextColor(r.getColor(R.color.default_text)); 
     b.setBackgroundColor(Color.WHITE); 
    } 
} 

này có thể có ích cho một số người !!!

+1

Trong một ngôn ngữ OO như Java, đây thực sự không phải là cách làm ưu tiên, đặc biệt là xem xét khả năng bảo trì. –

4

Hãy thử điều này:

<item name="buttonBarStyle">@style/Widget.AppCompat.ButtonBar</item> 
    <item name="buttonBarButtonStyle">@style/AppTheme.Button</item> 
    <item name="buttonBarPositiveButtonStyle">@style/YoursTheme</item> 
    <item name="buttonBarNegativeButtonStyle">@style/YoursTheme</item> 
    <item name="buttonBarNeutralButtonStyle">@style/YoursTheme</item> 
+1

Điều này sẽ hữu ích hơn nếu bạn muốn giải thích vị trí đặt các dòng này. Tôi chắc chắn không thể tìm ra nó ... – RenniePet

+0

Cảm ơn bạn vì điều đó, đã tìm kiếm nó hàng giờ! @RenniePet bạn nên đặt nó vào chủ đề Dialog của bạn, một chủ đề mà có lẽ nên mở rộng 'ThemeOverlay.AppCompat.Dialog.Alert' và bạn khai báo trong chủ đề của bạn bằng cách sử dụng @ style/YourDialogTheme Benoit

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