<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Android on 代码学习站</title>
        <link>https://a6233.com/categories/android/</link>
        <description>Recent content in Android on 代码学习站</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Tue, 21 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://a6233.com/categories/android/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>日夜切换按钮文字颜色偶发异常排查记录</title>
        <link>https://a6233.com/posts/day-night-button-color-debug/</link>
        <pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate>
        
        <guid>https://a6233.com/posts/day-night-button-color-debug/</guid>
        <description>&lt;h2 id=&#34;问题&#34;&gt;问题
&lt;/h2&gt;&lt;p&gt;悬浮窗弹窗里做日夜主题切换，confirm按钮颜色正常，cancel按钮在白天模式下偶发显示夜间白色。&lt;/p&gt;
&lt;p&gt;关键特征：&lt;strong&gt;偶发&lt;/strong&gt;，不是每次都能复现。&lt;/p&gt;
&lt;h2 id=&#34;排查&#34;&gt;排查
&lt;/h2&gt;&lt;p&gt;先列4个假设，埋日志逐个排除：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;uiMode&lt;/code&gt;没切到白天 → &lt;strong&gt;否&lt;/strong&gt;，&lt;code&gt;uiMode=16&lt;/code&gt;确实出现&lt;/li&gt;
&lt;li&gt;confirm和cancel刷新链路不同 → &lt;strong&gt;否&lt;/strong&gt;，链路一致&lt;/li&gt;
&lt;li&gt;cancel刷新后取到的色值跟资源不一致 → &lt;strong&gt;是&lt;/strong&gt;，&lt;code&gt;currentTextColor&lt;/code&gt;有时跟&lt;code&gt;text_color_normal&lt;/code&gt;对不上&lt;/li&gt;
&lt;li&gt;刷新后被其他逻辑覆盖 → &lt;strong&gt;否&lt;/strong&gt;，前后一致&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;为什么confirm没事cancel有事&#34;&gt;为什么confirm没事，cancel有事？
&lt;/h2&gt;&lt;p&gt;两个按钮的色资源策略不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;confirm用&lt;code&gt;*_normal_h&lt;/code&gt; / &lt;code&gt;*_disable_h&lt;/code&gt;（高亮色），昼夜差异小&lt;/li&gt;
&lt;li&gt;cancel用&lt;code&gt;*_normal&lt;/code&gt; / &lt;code&gt;*_disable&lt;/code&gt;（默认色），白天黑、夜间白，差异大&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;confirm不是没问题，是问题藏得更深。&lt;/p&gt;
&lt;h2 id=&#34;根因&#34;&gt;根因
&lt;/h2&gt;&lt;p&gt;同一轮刷新里，&lt;code&gt;mContext&lt;/code&gt;解析出来的&lt;code&gt;text_color_normal&lt;/code&gt;已经是白天黑值，但cancel按钮内部的&lt;code&gt;enabledColor&lt;/code&gt;还是夜间白值。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;配置已经更新&amp;quot;和&amp;quot;按钮内部色表同步完成&amp;quot;之间存在时序窗口。正常Activity重建不会触发，但悬浮窗+手动&lt;code&gt;onConfigurationChanged&lt;/code&gt;+非重建这条路把它暴露出来了。&lt;/p&gt;
&lt;h2 id=&#34;修复&#34;&gt;修复
&lt;/h2&gt;&lt;p&gt;不依赖间接selector查找，直接用资源引用+手动构建ColorStateList：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;val&lt;/span&gt; defaultColors = ColorStateList(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    arrayOf(intArrayOf(-android.&lt;span style=&#34;color:#a6e22e&#34;&gt;R&lt;/span&gt;.attr.state_enabled), intArrayOf()),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    intArrayOf(disableColor, normalColor)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;绕开不稳定链路，确定性地拿到当前主题下的色值。&lt;/p&gt;
&lt;h2 id=&#34;复测&#34;&gt;复测
&lt;/h2&gt;&lt;p&gt;多轮夜→昼→夜切换：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cancel白天稳定黑色&lt;/li&gt;
&lt;li&gt;夜间稳定白色&lt;/li&gt;
&lt;li&gt;disabled状态颜色正确&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;排障清单&#34;&gt;排障清单
&lt;/h2&gt;&lt;p&gt;遇到&amp;quot;主题切换后颜色偶发异常&amp;rdquo;，按顺序查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确认&lt;code&gt;uiMode&lt;/code&gt;是否正确&lt;/li&gt;
&lt;li&gt;对比&lt;code&gt;currentTextColor&lt;/code&gt;和期望资源色值&lt;/li&gt;
&lt;li&gt;检查enabled/disabled状态&lt;/li&gt;
&lt;li&gt;确认没有末尾覆盖&lt;/li&gt;
&lt;li&gt;审查是否依赖&amp;quot;间接selector+手动刷新&amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;先拿运行时证据，再做最小修复。别猜，看日志。&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
