当前位置: 首页 > 知识库问答 >
问题:

用资源字符串替换“占位符”?

衡翰翮
2023-03-14

我的问题的背景是,我试图本地化一些HTML文件,但我不想为每种语言拥有完整的HTML副本,我只想“以Android的方式”做到这一点,并在我的HTML中使用本地化字符串资源。

假设我在一个字符串中有一些HTML,在将HTML发送到WebView之前,应该用字符串资源替换占位符--我如何做到这一点?

<div>[myTitle]</div>
<div>[myContent]</div>

和这些字符串资源:

<string name="myTitle">My title</string>
<string name="myContent">My content</string>

现在,举一个简单的例子,我可以使用string.replace(),但是如果我想让它更加动态,也就是说,当我向HTML添加更多占位符时,我不想编写任何新的替换代码,那该怎么办?我知道这是可能的,但我只是在网上找不到任何示例(大多数regex示例都是简单的静态搜索和替换操作)。

共有1个答案

百里金林
2023-03-14

通过一些反复试验,我设法自己想出了这个解决方案,不确定是否有更好/更有效的方案?

// Read asset file into String
StringBuilder buf = new StringBuilder();
InputStream is = null;
BufferedReader reader = null;

try{
    is = getActivity().getAssets().open("html/index.html");
    reader= new BufferedReader(new InputStreamReader(is, "UTF-8"));
    String line;

    while ((line=reader.readLine()) != null) {
        buf.append(line);
    }
}
catch(IOException e){
    e.printStackTrace();
}
finally{
    try{
        reader.close();
        is.close();
    }
    catch(IOException e){
        e.printStackTrace();
    }

}

String htmlStr = buf.toString();


// Create Regex matcher to match [xxx] where xxx is a string resource name
Pattern p = Pattern.compile("\\[(.*?)\\]");
Matcher m = p.matcher( htmlStr );


// Replace matches with resource strings
while(m.find()) {
    String placeholder = m.group(); // Placeholder including [] -> [xxx]
    String placeholderName = m.group(1); // Placeholder name    -> xxx

    // Find the string resource
    int resId = getResources().getIdentifier(placeholderName, "string", getActivity().getPackageName() );

    // Resource not found?              
    if( resId == 0 )
        continue;

    // Replace the placeholder (including []) with the string resource              
    htmlStr = htmlStr.replace(placeholder, getResources().getString( resId ));

    // Reset the Matcher to search in the new HTML string
    m.reset(htmlStr);           
}


// Load HTML string into WebView
webView.loadData(htmlStr, "text/html", "UTF-8");
 类似资料:
  • 问题内容: 我的字符串看起来像这样:“您可以在[开始日期+ 30]之前使用促销。” 我需要将占位符替换为实际日期- 这是销售的开始日期加上30天(或其他任何数字)。也可以单独显示而无需添加数字。同样,占位符内的所有多余空格都应被忽略,并且不要使替换失败。 用Java做到这一点的最佳方法是什么?我正在考虑用于查找占位符的正则表达式,但不确定如何执行解析部分。如果只是[开始日期],我将使用该方法,但由

  • 问题内容: 对于我的项目,我需要将有向图转换为图的张量流实现,就好像它是神经网络一样。在tensorflow版本1中,我可以将所有输入定义为占位符,然后使用广度优先搜索图为输出生成数据流图。然后,我只需使用feed_dict来输入我的输入。但是,在TensorFlow v2.0中,他们决定完全放弃占位符。 如何在不使用占位符的情况下为每个接受可变数量的输入并返回可变数量的输出的图制作tf.func

  • 我一直在尝试通过FieldMailMerge和VariableReplace示例,但似乎无法运行本地测试用例。我基本上试图从一个docx模板文档开始,并让它从一个模板创建x个docx文档,替换变量。 在下面的代码中,试图替换单个变量,但失败了。模板文件中的${}值作为处理的一部分被移除,因此我认为它正在查找它们,而不是出于某种原因替换它们。我明白这可能是由于格式问题,正如示例代码的注释中所解释的那

  • 我有一个函数,显示用户名。它工作得很好,但我收到了这个警告,我想知道如何解决它。

  • 问题内容: 我正在寻找实现以下目标的方法: 我可以自己编写它,但是在我看来,我曾经看过一个执行此操作的库,可能是slf4j记录器,但是我不想编写日志消息。我只想生成字符串。 您知道这是哪个图书馆吗? 问题答案: 参见方法。

  • 问题内容: 使用pysqlite我正在制定一个程序来处理一些数据。对多个表和列中的相似字段执行相同类型的操作,因此我认为我可以参数化sql语句,如下所示: 我得到的错误不是很有帮助(),但我明白了:Pysqlite不赞赏以这种方式使用占位符。 谁能指出正在发生的事情以及执行上述操作的正确方法? 问题答案: 您根本不能将占位符用于列或表名。我对此没有权威的引用-我只是从尝试过和失败中“知道”这一点。