首页 > 解决方案 > 来自 strings.xml 的字符串在应用程序中可用但不被小部件使用

问题描述

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

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

然后我将按钮的text属性设置为@string/thing. 正如预期的那样,这会在布局编辑器中正确显示“做一件事”。但是,当我在手机上使用 Android Studio 中的默认运行或调试命令实际加载我的应用程序时,该按钮为空白。这很有趣,因为当我手动调用时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 中启动时,该按钮也是空白的,所以很明显我一定做错了什么。 这是完整的活动布局和字符串 XML 文件。

标签: androidstringtextandroid-resources

解决方案


您的每个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可以让您了解布局在工具中的真实外观,而不是在您的应用程序运行时预先填充该文本。

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


推荐阅读