安卓app也有国际化问题,即app界面随手机显示的语种(中文、英文等),自动变更菜单语言。android studio中的做法,是把写死的textview文本控件的值(Hardcode), 如android: text="lol", 提取到string.xml中。
标准的做法是把光标移动到含Hardcode的代码行内,代码行左侧就会浮现一个灯泡。![]()
鼠标移动到灯泡上,会提示按 Alt+Enter组合键完成提取,或

鼠标点击灯泡,选择“Extract string resource"选项。

在Extract Resource对话框中设置好各种名称和值后,

结果是被提取的代码行变成:
android:text="@string/lol"
并且,string.xml中多了一行:
<string name="lol">lol</string>
一般是在app编写的最后,才把字符串全部提取出来。然而,搜了很多网站,即使stackflow上不能提供一键提取所有字符串的方法。 最多是在as中先把所有字符串检索出来,再逐一点击提取(Analyze - Run Inspection by Name... - 输入Hardcoded text Android Lint);而且,这个方法还不适用于java文件。
很奇怪as为什么没有批量提取的菜单选项。
从原理上说,只需在所有.xml文件中查找形如android:text=" "的代码,在.java文件中筛选出带.setText(""),addText("")等等的代码,就可以批量替换了。
as中各文件中变量名称的弱关联或许是一个原因。 比如,刚才举例的两行代码:
activity_main.xml中被提取的代码行: android:text="@string/lol"
对应string.xml中: <string name="lol">lol</string>
如果在activity_main.xml中修改text的值,string.xml的代码不会发生任何变化;反之,如果删除string.xml中的<string name=...>这行代码,在activity_main.xml的文本值@string/lol会变为红色,但不会自动转化为hardcode.
从远离来说,android studio设置一个全部提取字符串的值,对as平台设计者来说,是可能的。前提是被提取字符串被修改、或删除后,string.xml中的相应string name行随之更改、去掉。如果考虑系统提取效率,菜单也可以设置可中断和续借的提取流程。
本文探讨了在Android Studio中如何将硬编码的文本(Hardcode)抽取到string.xml文件中进行国际化处理。介绍了标准的提取方法,即通过代码行左侧的灯泡提示进行操作。尽管没有一键提取所有字符串的功能,但可以使用Lint检查来查找硬编码的文本。作者提出,批量提取的实现可能受到文件间弱关联的影响,并建议Android Studio未来能提供此类功能。
824

被折叠的 条评论
为什么被折叠?



