ContextCompat.getColor () bỏ qua NightMode


9

TL, DR;

ContextCompat.getColor()không sử dụng màu đêm ( values-night/colors.xml) mặc dù khi bật chế độ ban đêm.

Đây là vấn đề:

Chào mọi người,

Vì vậy, tôi đang triển khai một chủ đề tối cho ứng dụng Android của mình, tôi gọi nó để kích hoạt nó: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

Tôi đã đặt màu trong values/colors.xmlvà có phiên bản tối trong values-night/colors.xml. Màu sắc thay đổi tốt tùy thuộc vào nightMode, NHƯNG:

Khi tôi sử dụng ContextCompat.getColor(getApplicationContext(), R.id.myColor), nó sử dụng màu bình thường ( values/colors.xml) chứ không phải màu đêm ( values-night/colors.xml).

Theo tôi build.gradle, tôi đã thiết lập những điều sau:

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0-beta01'

Ai đó có thể vui lòng cho tôi biết tôi đang làm gì sai?

PS: Tôi đã xem xét câu hỏi sau đây và nó không trả lời vấn đề này /programming/57779661/contextcompat-getcolor-method-ignores-night-mode


1
Tôi không thể sao chép nó, tôi đang sử dụng appcompat 1.1.0 và cả hai màu từ XML và ContextCompat.getColor()trả về các giá trị hợp lệ sau khi buộc chế độ ban đêm. Bạn có thể giải thích câu hỏi của mình bằng đoạn mã (khi bạn thay đổi chế độ ban đêm / lấy màu) không?
Pawel

1
Bạn có thể đang chuyển một bối cảnh không hợp lệ (chẳng hạn như ApplicationContext) để có được getColor. Bạn có thể vui lòng chia sẻ làm thế nào bạn gọi getColor?
W0rmH0le

@ W0rmH0le vâng, tôi đã thông qua ApplicationContext, tôi không biết tôi cần sử dụng hoạt động này để hoạt động! Bạn có thể vui lòng cho câu trả lời này là câu trả lời chính thức để tôi có thể đánh dấu câu trả lời của bạn là câu trả lời hợp lệ không?
Mathieu de Brito

@Pawel Cảm ơn phản hồi của bạn, nó đã giúp tôi biết rằng đó là một lỗi trong mã của tôi :)
Mathieu de Brito

Rất vui vì tôi có thể giúp! Tôi đã đối mặt với các vấn đề tương tự ... Cuối cùng, tôi đã sử dụng bối cảnh ứng dụng như bạn
W0rmH0le

Câu trả lời:


11

Tôi phải đối mặt với các vấn đề tương tự với chế độ ban đêm. Một số màn hình vẫn ổn nhưng một số khác vẫn giữ chủ đề thường xuyên. Cuối cùng, tôi phát hiện ra rằng tôi đang khởi tạo một số chế độ xem bằng bối cảnh của Ứng dụng thay vì bối cảnh hoạt động hiện tại. Vì một số lý do, bối cảnh của Ứng dụng không theo dõi loại thông tin này.

Vì vậy, hãy cập nhật mã của bạn để sử dụng bối cảnh hoạt động hiện tại thay vì bối cảnh ứng dụng.

Để tham khảo cho người dùng khác. Tránh:

ContextCompat.getColor(getApplicationContext(), R.id.myColor)

Và sử dụng:

// In a Activity
ContextCompat.getColor(this, R.id.myColor)

// In a View
ContextCompat.getColor(getContext(), R.id.myColor)

// In a Fragment (check against null because getColor can trigger a NPE
Context context = getContext()
if (context != null) {
    ContextCompat.getColor(context, R.id.myColor)
}

3
Applicationlà bối cảnh "thô", nó sẽ luôn tham chiếu các giá trị từ kiểu mặc định và bỏ qua mọi cấu hình. AppCompatActivitymặt khác không xử lý các cấu hình phù hợp và được liên kết đến AppCompatDelegate.
Pawel

@Pawel bổ sung rất tốt cho câu trả lời này, Cảm ơn!
muetzenflo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.