Câu hỏi Thay đổi màu hộp thoại Datepicker cho Android 5.0


Có thể thay đổi lược đồ màu datepicker (và cũng là trình theo dõi thời gian) cho android 5.0 không?

Tôi đã thử thiết lập các màu nhấn, nhưng điều này không hoạt động (cả có và không có) android:):

<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">@color/purple</item>

<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">@color/purple_tint</item>

<!-- colorAccent is used as the default value for colorControlActivated
     which is used to tint widgets -->
<item name="colorAccent">@color/purple_tint</item>

Từ bản gốc: enter image description here

Để một cái gì đó như thế này: enter image description here


75
2018-02-26 08:59


gốc


Màu của bạn được đặt theo màu nào trong kiểu chủ đề ứng dụng của bạn - Neil
@Neil Tôi đã thêm mã mà tôi đã cố gắng sử dụng để tạo kiểu cho đến thời điểm này. - Warpzit


Các câu trả lời:


Lý do tại sao đề xuất của Neil dẫn đến toàn màn hình DatePicker là lựa chọn chủ đề gốc:

<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
    <item name="colorAccent">@color/blue_500</item>
</style>

Hơn nữa, nếu bạn đi tuyến đường này, bạn phải chỉ định chủ đề trong khi tạo DatePickerDialog:

// R.style.DialogTheme
new DatePickerDialog(MainActivity.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        //DO SOMETHING
    }
}, 2015, 02, 26).show();

Điều này, theo ý kiến ​​của tôi, là không tốt. Người ta nên cố gắng giữ kiểu dáng ra khỏi java và bên trong styles.xml / themes.xml.

Tôi đồng ý rằng đề xuất của Neil, với một chút thay đổi (thay đổi chủ đề gốc để nói, Theme.Material.Light.Dialog) sẽ cho bạn kết quả mong muốn. Nhưng, đây là cách khác:

Trong lần kiểm tra đầu tiên, chúng tôi gặp datePickerStyle xác định những thứ như: headerBackground(những gì bạn đang cố thay đổi), dayOfWeekBackgroundvà một vài màu văn bản và kiểu văn bản khác.

Việc ghi đè thuộc tính này trong chủ đề của ứng dụng sẽ không hoạt động. DatePickerDialog sử dụng một chủ đề riêng biệt được gán bởi thuộc tính datePickerDialogTheme. Vì vậy, để những thay đổi của chúng tôi có ảnh hưởng, chúng tôi phải ghi đè datePickerStyle bên trong một overriden datePickerDialogTheme.

Ở đây chúng ta đi:

Ghi đè datePickerDialogTheme bên trong chủ đề cơ sở của ứng dụng:

<style name="AppBaseTheme" parent="android:Theme.Material.Light">
    ....
    <item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>

Định nghĩa MyDatePickerDialogTheme. Lựa chọn chủ đề gốc sẽ phụ thuộc vào chủ đề cơ sở của ứng dụng của bạn là gì: nó có thể là Theme.Material.Dialog hoặc là Theme.Material.Light.Dialog:

<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
    <item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>

Chúng tôi đã ghi đè datePickerStyle với phong cách MyDatePickerStyle. Sự lựa chọn của phụ huynh một lần nữa sẽ phụ thuộc vào chủ đề cơ sở của ứng dụng của bạn là gì: Widget.Material.DatePicker hoặc là Widget.Material.Light.DatePicker. Xác định nó theo yêu cầu của bạn:

<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
    <item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>

Hiện tại, chúng tôi chỉ ghi đè headerBackground theo mặc định được đặt thành ?attr/colorAccent (đây cũng là lý do tại sao Neil đề xuất hoạt động trong việc thay đổi nền). Nhưng có khá nhiều tùy chỉnh có thể:

dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor

Nếu bạn không muốn điều khiển nhiều (tùy chỉnh), bạn không cần ghi đè datePickerStyle. colorAccent kiểm soát hầu hết DatePicker's màu sắc. Vì vậy, chỉ ghi đè colorAccent phía trong MyDatePickerDialogTheme nên làm việc:

<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
    <item name="android:colorAccent">@color/date_picker_accent</item>

    <!-- No need to override 'datePickerStyle' -->
    <!-- <item name="android:datePickerStyle">@style/MyDatePickerStyle</item> -->
</style>

Ghi đè colorAccent mang lại cho bạn lợi ích bổ sung khi thay đổi OK & CANCEL văn bản màu sắc là tốt. Không tệ.

Bằng cách này bạn không phải cung cấp bất kỳ thông tin tạo kiểu nào cho DatePickerDialog's constructor. Mọi thứ đã được kết nối đúng cách:

DatePickerDialog dpd = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

    }
 }, 2015, 5, 22);

 dpd.show();

249
2018-03-12 15:56



Cảm ơn bạn đã mô tả tốt và đầy đủ về cách hoạt động của nó và cách nó phải được ghi đè theo kiểu - Warpzit
@Vikram calendarSelectedTextColor không tìm thấy. - Akhilesh Dhar Dubey
Có thể tương thích ngược với android <21 datePicker không? - RoCk
@RoCk Không chắc chắn những gì bạn có nghĩa là, nhưng tôi đã xây dựng một thư viện để trở lại cổng các bộ chọn Ngày & Giờ từ phiên bản Android 23 đến phiên bản 14. Dự án được lưu trữ tại: https://github.com/vikramkakkar/SublimePicker. - Vikram
Câu trả lời rất hay! cảm ơn bạn - dum4ll3


Hãy thử một lần.

Mật mã

new DatePickerDialog(MainActivity.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        //DO SOMETHING
    }
}, 2015, 02, 26).show();

Phong cách Trong tệp styles.xml của bạn

EDIT - Đã thay đổi chủ đề thành Theme.AppCompat.Light.Dialog như được đề xuất

<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorAccent">@color/blue_500</item>
</style>

47
2018-02-26 09:18



Có màu tím, nhưng cũng toàn màn hình :) nhưng có lẽ nếu tôi đặt nó bên trong một mảnh nó sẽ được chứa. Bất kỳ gợi ý nào trước khi tôi bắt đầu chơi với nó một lần nữa? - Warpzit
Tôi sẽ xem liệu tôi có thể tìm ra giải pháp thích hợp hơn không làm cho nó trở nên toàn màn hình - Neil
Chỉ dùng parent="Theme.AppCompat.Light.Dialog" thay vì parent="Theme.AppCompat.Light" - Chupik
@Neil cảm ơn cho câu trả lời, chỉ cho tôi đi đúng hướng và điều này là đúng giải pháp nhanh nhất nhưng tôi đã tìm kiếm một cách tiếp cận tất cả phong cách / chủ đề :) - Warpzit
Không hoạt động trên Android 6, màn hình đầy và màu sắc không thay đổi - Jemshit Iskenderov


Chỉ cần đề cập đến, bạn cũng có thể sử dụng một chủ đề mặc định như android.R.style.Theme_DeviceDefault_Light_Dialog thay thế.

new DatePickerDialog(MainActivity.this, android.R.style.Theme_DeviceDefault_Light_Dialog, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    //DO SOMETHING
    }
}, 2015, 02, 26).show();

3
2018-01-28 17:51





Bạn không có chủ đề tạo ra chỉ cần viết nó trong đối tượng tạo hộp thoại của bạn

DatePickerDialog datePicker = new DatePickerDialog(getActivity(), AlertDialog.THEME_HOLO_LIGHT,this, mYear, mMonth, mDay);

làm theo nó, nó sẽ cung cấp cho bạn tất cả kiểu kiểu bộ chọn ngày nó thực sự hoạt động

http://www.android-examples.com/change-datepickerdialog-theme-in-android-using-dialogfragment/


1
2017-07-29 07:28



Hoạt động như Gem, bro! - sam
AlertDialog.THEME_HOLO_LIGHT không dùng nữa .. không hoạt động - Yash


thử cái này, làm việc cho tôi

Đặt hai tùy chọn, colorAccent và android:colorAccent

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
   ....
    <item name="android:dialogTheme">@style/AppTheme.DialogTheme</item>
    <item name="android:datePickerDialogTheme">@style/Dialog.Theme</item>
</style>

<style name="AppTheme.DialogTheme" parent="Theme.AppCompat.Light.Dialog">

<!-- Put the two options, colorAccent and android:colorAccent. -->
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:colorPrimary">@color/colorPrimary</item>
    <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="android:colorAccent">@color/colorPrimary</item>
 </style>

1
2018-03-20 19:46





Tôi đã có vấn đề mà nút chọn thời gian đã không được nhìn thấy trong màn hình cho API 24 trong Android. (API 21+) nó được giải quyết bởi

<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
            <item name="android:colorAccent">@color/colorPrimary2</item></style>

<style name="Theme" parent="BBaseTheme">
         <item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>

0
2018-05-23 17:04





<style name="AppThemeDatePicker" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorAccent">@color/select2</item>
    <item name="android:colorAccent">@color/select2</item>
    <item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>


<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
    <item name="android:headerBackground">@color/select2</item>
</style>

0
2017-08-24 05:38





Để thay đổi màu văn bản của mục danh sách Năm (SPECIFIC FOR ANDROID 5.0)

Chỉ cần đặt màu văn bản nhất định trong kiểu hộp thoại bộ chọn ngày của bạn. Đối với một số lý do thiết lập cờ yearListItemTextAppearance không phản ánh bất kỳ thay đổi nào trong danh sách năm.

<item name="android:textColor">@android:color/black</item>

0
2018-06-25 07:56