来自 strings.xml 的字符串在应用程序中可用但未被小部件使用

Strings from strings.xml available in application but not used by widgets

我一直在制作 Android 应用程序。 Android 如果我在布局编辑器中对字符串进行硬编码,Studio 会责备我,所以我将它们放在 res/values/strings.xml 中。举个简单的例子:

<resources>
    <string name="thing">Do a thing</string>
</resources>

然后我将按钮的 text 属性 设置为 @string/thing。正如预期的那样,这会在布局编辑器中正确显示 "Do a thing"。但是,当我使用默认的 运行 或 Android Studio 中的调试命令实际在我的 phone 上加载我的应用程序时,该按钮是空白的。这很有趣,因为当我手动调用 resources.getString(R.string.thing) 时,我确实得到了 "Do a thing"

我可以通过这种方式手动设置小部件的文本字段,方法如下:

findViewById<Button>(R.id.myButton).text = resources.getString(R.string.thing)

但据我所知,这是很多应该自动完成的工作。我在 Java 应用程序中也发生过这种情况,因此问题不是 Kotlin 特有的。我在 Linux 上使用 Android Studio 3.6,设备是装有 LineageOS 16 (Pie) 的 Redmi Note 3 Pro。 当应用程序在虚拟 AVD 中启动时,按钮也是空白的,很明显我一定是做错了什么。 Here are the full activity layout and string XML files.

您的每个 Button 小部件都有 tools:text 而不是 android:text:

<Button
    android:id="@+id/nextButton"
    style="@style/Widget.AppCompat.Button.Borderless"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    tools:text="@string/nav_next" />

android:text 用于在运行时显示的固定文本,默认情况下,在开发工具中显示。

tools:text 仅用于开发工具中显示的示例文本。大多数情况下,您真正​​想要使用的文本在运行时才知道(例如,需要从数据库加载)。使用 tools:text 可以让您了解布局在工具中的真实外观,同时不会在您的应用程序运行时预先填充该文本。

因此,从 tools:text 切换到 android:text,您应该会得到想要的结果。