Intellij Idea 将所有硬编码字符串提取到字符串资源

jk9hmnmh  于 2022-11-21  发布在  其他
关注(0)|答案(5)|浏览(307)

我知道有Alt + Enter组合可以将单个字符串提取到字符串资源中,但是我想知道有没有什么可以将我的项目中的所有字符串提取到字符串资源中?
此外,如果我制作其中一个,Android Studio不会制作相同的字符串到字符串资源。

String s = "Hello World";
String s2 = "Hello World";

例如,我把“Hello World”作为字符串资源,另一个仍然硬编码在同一个文件中,以及在项目中。

String s = getString(R.string.helloworld);
String s2 = "Hello World";

如果有人知道那样的事情。

8fsztsew

8fsztsew1#

我 相信 你 正在 寻找 的 快捷 方式 是 ( 在 Mac 上 ) Alt + Command + C

ma8fv8wu

ma8fv8wu2#

作为您的要求,正如我所知,在Android Studio中没有这样的功能,你真的在寻找,但这里有一些替代方法,可以帮助你.

  • 进入“AnalyzeRun Inspection ..“,然后输入"Hardcoded strings"。在整个项目中运行它,你会得到一个检查结果面板,它会显示项目的所有硬编码文本。然后按Alt + Enter,你会得到一个自动提取字符串的选项。
  • 另一种方法是查找和替换但它并不更好,因为它很耗时。要简化这种方法,您可以查看here以获得灵活性。
3pvhb19x

3pvhb19x3#

对于XML布局文件中的硬编码字符串:
点击Analyze -〉Run inspection by name -〉enter Hardcoded strings -〉select the whole project -〉OK.在这里,你将从你的xml布局文件中得到所有的硬编码字符串,只有你可以通过以下方式提取到strings.xml中:
单击硬编码文本-〉Alt + Enter -〉从资源中提取-〉为该字符串输入相应的资源名称-〉OK
对于Java类代码中的硬编码字符串:
点击Analyze -〉Run inspection by name -〉enter Hardcoded texts -〉select the whole project -〉OK.在这里,你将从你的Java类文件中得到所有的硬编码字符串,只有你可以通过以下方式提取到strings.xml中:
单击硬编码文本-〉Alt + Enter -〉从资源中提取-〉为该字符串输入相应的资源名称-〉OK -〉为Java代码中创建的每个字符串资源添加getString。
因此,在Android Studio中,硬编码字符串-〉Java类代码,而硬编码文本-〉Xml布局文件。

sgtfey8w

sgtfey8w4#

在Android 3.2.1中,您可以转到Edit->Find->Find In Path...,然后搜索android:text=",这将为您提供xml files中所有硬编码字符串的列表。
搜索Toast.makeText以查找java files中的所有吐司项目。
Search for setText("可搜索java files中的文本集,依此类推。
您可以像这样搜索要在整个项目中查找并替换的对象。

gcxthw6b

gcxthw6b5#

我编写了下面的脚本,从activity.xml文件中提取所有硬编码字符串,并将它们添加到strings.xml中。(Bash/Linux):

用法:extractAll.sh activity_main.xml strings.xml

在进行更改之前备份原始文件。

#!/bin/bash
################################################################################
#  Extract All Hardcoded Strings From an Activity XML File and Save New 
#  Versions of the activity.xml and strings.xml
################################################################################

#check the number of arguments supplied, print usage if not 2
if [ "$#" -ne 2 ]; then
    echo "extract all hardcoded strings from activity.xml and update .xml files"
    echo "original files are saved with .bak extension"
    echo "usage: $0 activity.xml strings.xml"
    exit
fi

#backup input files
cp $1 $1.bak
cp $2 $2.bak

#grep for hardcoded strings, for each one sed out special characters, change 
#all to lower case, replace space characters with underscores, truncate string
#variable names to 30 characters. The result will be the name of the new string
#variable entered in strings.xml
grep -Po "(?<=android:text=\")[^\"]+(?=\")" $1 | while read -r HARDSTRING ; do
    STRINGVARNAME=`echo $HARDSTRING | sed 's/\([\d0-\d31]\|[\d33-\d35]\|\$\|[\d37-\d47]\|[\d58-\d64]\|[\d91-\d96]\|[\d123-\d126]\)//g'|sed -e 's/\(.*\)/\L\1/'|sed 's/ /_/g'|head -c 30`
    #substitute each hardcoded string with the string variable name
    sed -i "s/$HARDSTRING/@string\/$STRINGVARNAME/" $1
    #get the number of lines in strings.xml file
    NUMLINES=`wc -l < $2`
    #insert string definition at second-to-last line of strings.xml
    let "NUMLINES++" #I had to increment mine to get the desired result
    #add an entry to the strings.xml defining the newly extracted string
    sed -i "$NUMLINES""i\\    <string name=\""$STRINGVARNAME"\">$HARDSTRING</string>\\" $2
done

最后注意:在我使用Android Studio创建的strings.xml文件的测试用例中,wc -l返回的值比预期少1(我怀疑是因为最后一行没有换行符)。这导致sed -i在倒数第三个位置插入新行,而不是预期的倒数第二个位置。我的修复方法是使用let递增wc -l的结果。

参考资料:

What are invalid characters in XML
sed one-liner to convert all uppercase to lowercase?
How to process each output line in a loop?
How can I truncate a line of text longer than a given length?
Linux Shell Script - String Comparison with wildcards
How to insert a string into second to last line of a file
Check number of arguments passed to a Bash script
https://askubuntu.com/questions/385528/how-to-increment-a-variable-in-bash
https://docs.oracle.com/cd/E82085_01/150/funtional_artifacts_guide/or-fasg-standards.htm
https://tldp.org/LDP/abs/html/refcards.html#AEN22828

相关问题