在Android Studio中为所有硬编码字符串

时间:2016-12-10 17:34:30

标签: android android-studio android-resources

当我开始编写项目时,我不知道字符串资源。现在我想将这个资源用于我的所有字符串。你怎么突然这么做?知道我目前有超过10000个字符串,我不想一个一个地手工完成......

4 个答案:

答案 0 :(得分:2)

要完全自动完成此操作,您需要一个特殊工具(我还没有找到),在Android Studio之外:

  • 查找字符串(并替换为引用)
  • 更新strings.xml
  • 可选择翻译字符串


一次一个手动提取(另请参阅link):
Alt + 输入提取字符串资源,同时插入符号位于代码

中的硬编码字符串中

extract

并在 XML

extract

答案 1 :(得分:0)

我不认为,考虑到需要使用唯一且有用的标识符以某种方式命名所有字符串。当您自动完成此操作时,您的代码将很难阅读:/

答案 2 :(得分:0)

只需突出显示字符串的每个实例,然后单击statemnt左侧的黄色提示图标以提取字符串资源。然后您可以在以后删除重复的字符串。

答案 3 :(得分:0)

我至少为需要XML的人写了一个用于xml布局的Java脚本...以后可能需要一些小的修复。

package com.cameron.smelevel.lib;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

    public class StringResourceCreator {


    public static void main(String [] args){
        String mainDirPath = "S:\\androidProject\\src";
        String layoutDirPath = "\\main\\res\\layout";
        String outputDirPath = mainDirPath+"-out";
        String stringFilePath = outputDirPath+"\\strings.txt";
        String line;

        File layoutDir = new File(mainDirPath + layoutDirPath);
        File layoutOutDir = new File(outputDirPath + layoutDirPath);
        layoutOutDir.mkdirs();
        HashMap<String, String> stringEnteries = new HashMap<>();
        for (File file : layoutDir.listFiles()) {
            String fileName = file.getName();
            PrintWriter pr = null;
            try {
                // FileReader reads text files in the default encoding.
                FileReader fileReader = new FileReader(file);

                // Always wrap FileReader in BufferedReader.
                BufferedReader bufferedReader = new BufferedReader(fileReader);
                FileWriter outputStream = new FileWriter(layoutOutDir.getAbsolutePath() + "\\"+ fileName);
                pr = new PrintWriter(outputStream);

                while ((line = bufferedReader.readLine()) != null) {
                    line = getModifiedLine(line, stringEnteries);
                    pr.write(line);
                    pr.println();
                }
            } catch(FileNotFoundException ex) {
                System.out.println("Unable to open file '" + fileName + "'");
            } catch (IOException ex) {
                System.out.println("Error reading file '" + fileName + "'");
                // Or we could just do this:
                // ex.printStackTrace();
            }finally {
                if(pr != null) pr.close();
            }
        }
        PrintWriter pr = null;
        try {
            FileWriter outputStream = new FileWriter(stringFilePath);
            pr = new PrintWriter(outputStream);

            Iterator it = stringEnteries.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry pair = (Map.Entry)it.next();
                String entry = "<string name=\"" + pair.getKey() + "\">" + pair.getValue() + "</string>";
                it.remove(); // avoids a ConcurrentModificationException

                pr.write(entry);
                pr.println();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(pr != null) pr.close();
        }
    }

    private static String getModifiedLine(String line, HashMap<String, String> stringEnteries) {
        if (line.contains(":text=\"") || line.contains(":hint=\"")){
            StringBuilder fieldName = new StringBuilder();
            String text = line.substring(line.indexOf("\"")+1, line.lastIndexOf("\""));
            String textTrimmed = text.replace("\\n","");
            if (!textTrimmed.startsWith("@string")){
                String[] words = textTrimmed.split(" ");
                for (int j = 0; j < words.length; j++) {
                    String word = words[j];
                    for (int i = 0; i < word.length(); i++) {
                        char c = word.charAt(i);
                        if (Character.isAlphabetic(c))
                            if (i == 0 && fieldName.length() != 0)
                                fieldName.append(Character.toUpperCase(c));
                            else
                                fieldName.append(Character.toLowerCase(c));
                    }
                }
                if (fieldName.length() > 1) {
                    String value = stringEnteries.get(fieldName.toString());
                    if(value != null) {
                        if (!value.equals(text)) {
                            fieldName.append("1");
                            stringEnteries.put(fieldName.toString(), text);
                        }
                    }else
                        stringEnteries.put(fieldName.toString(), text);

                    line = line.replace(text, "@string/"+fieldName);//replaceLast(line, text, "@string/"+fieldName);
                }
            }
        }
        return line;
    }

}