启用深色主题时未显示格式化字符串资源

Formatted String Resource Not Appearing When Dark Theme Enabled

我已经 运行 完成了本 Android Developer CodeLab 的前两部分。在我实施 Dark Theme 之前,我已经创建了一个可以正常工作的小费计算器。没有启用深色主题,我的应用程序如下所示:

启用深色主题后,已格式化的文本(参见下面的代码)不再显示。

文本格式如下:

    private fun displayTip(tip : Double) {
        val formattedTip = NumberFormat.getCurrencyInstance().format(tip)
        binding.tipResult.text = getString(R.string.tip_amount, formattedTip)
    }

其中字符串资源 'tip_amount' 定义为:

<string name="tip_amount">Tip Amount: %s</string>

小费计算如下:

    private fun calculateTip() {
        val serviceCost = binding.costOfService.text.toString()
        val cost = serviceCost.toDoubleOrNull()
        if (cost == null || cost == 0.0) {
            displayTip(0.0)
            return
        }
        val tipPercentage = when (binding.tipOptions.checkedRadioButtonId) {
            R.id.option_fifteen_percent -> 0.15
            R.id.option_eighteen_percent -> 0.18
            else -> 0.20
        }
        var tip = tipPercentage * cost
        if (binding.roundUpSwitch.isChecked) {
            tip = kotlin.math.ceil(tip)
        }
        displayTip(tip)
    }

我正在按照 CodeLab 中的说明使用视图绑定:

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.calculateButton.setOnClickListener{calculateTip()}
    }

启用深色主题后消失的文本对应的文本视图如下(注意:在用户提供输入并按下按钮之前不会显示任何内容):

    <TextView
        android:id="@+id/tip_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:textSize="34sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/calculate_button"
        tools:text="Tip Amount: " />

最后我的 night/themes.xml 文件如下:

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.TipCalculator" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/green_light</item>
        <item name="colorPrimaryVariant">@color/green</item>
        <item name="colorOnPrimary">@color/black</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/blue_light</item>
        <item name="colorSecondaryVariant">@color/blue_light</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>
</resources>

为什么启用深色主题后我的分号和格式化文本消失了?为什么 TextView 中的其余文本仍然存在?

正如所讨论的 ,问题在于字符串资源在 values/strings.xml 和 night/strings.xml 中的显示方式不同。 night/strings.xml 中的字符串资源未被编辑为使用字符串格式,这是一个非常简单但耗时的错误。如果您收到类似的错误,我建议检查所有资源文件中所有字符串资源的定义是否相同。

values/strings.xml 已将资源定义为:

    <string name="tip_amount">Tip Amount: %1$s</string>

而 night/strings.xml 定义为:

    <string name="tip_amount">Tip Amount: </string>