如何在String.xml中使用两个具有相同名称的不同字符串值?

时间:2016-02-08 05:08:03

标签: java android

我希望有两种消息类型,例如讽刺和官方消息。当用户选择具有讽刺意味的所有消息以讽刺的方式显示并且当用户选择官方所有消息以官方方式显示时。我想在String.xml中使用两个具有相同名称但值不同的字符串值类型。我想选择在app运行时在程序中使用哪种类型。有没有其他方法可以做到这一点。 谢谢你的帮助。

6 个答案:

答案 0 :(得分:3)

string.xml中不能有2个不同的字符串或相同的键或名称

你可以将app_name和app_name_1设为具有讽刺意味的官方名称,每当官方只需将_1附加到字符串

答案 1 :(得分:1)

从技术上讲,你讲的是两种语言"具有讽刺意味的"和"官方"。 Android允许自定义语言。因此,只需在2个不同的资源目录中创建2个不同的字符串文件,例如values-irn / strings.xml和values-off / strings.xml。

然后在活动或应用程序的onCreate()中,执行以下操作:

Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = new Locale("irn"); // or "off"
resources.updateConfiguration(configuration, resources.getDisplayMetrics());

这应该这样做。

答案 2 :(得分:0)

如果你有单个消息在字符串xml中创建两个消息并按需要设置,如果有消息数组,你可以在字符串xml中创建字符串数组,并根据用户选择在小部件中设置它。

对于ex.if用户选择官方消息,您可以使用messages_array_of_official填充微调器,或者使用ironic_messages填充微调器

答案 3 :(得分:0)

我从你的问题中收集到的是你想要同一个名字的多个字符串值 - 字符串数组。

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string-array name="message">
      <item>Ironic</item>
      <item>Official</item>
  </string-array>
</resources>

检索字符串数组:

Resources res = getResources();
String[] msg = res.getStringArray(R.array.message);

答案 4 :(得分:0)

您无法切换字符串资源名称的含义,但您可以在预先构建的字符串映射集之间切换:

Resources res = getResources();

HashMap<Integer, String> ironic = new HashMap<Integer, String>()
ironic.put(R.string.official_hello, res.getString(R.string.ironic_hello);
ironic.put(R.string.official_goodbye, res.getString(R.string.ironic_goodbye);

HashMap<Integer, String> official = new HashMap<Integer, String>()
ironic.put(R.string.official_hello, res.getString(R.string.official_hello);
ironic.put(R.string.official_goodbye, res.getString(R.string.official_goodbye);

现在你可以使用具有讽刺意味的版本资源整数来查找具有讽刺意味的东西。您只需做出一个选择(可能在您的活动中)以使用正确的地图,并将其与官方字符串资源ID一起使用,以编程方式填充TextView对象:

HashMap<Integer, String> strings;
if (is_ironic) {
    strings = ironic;
} else {
    strings = official;
}

TextView tv_hello = ...
tv_hello.setText(strings.get(R.string.official_hello));

答案 5 :(得分:0)

您可以重新定位本地化。有很多本地化教程所以我只会理论上说。这是Android Documentationsome tutorial

优点:非常清晰的代码。

缺点:您可能必须以编程方式重新启动应用

理念是使用非ISO标准国家/地区代码作为Ironic语言和官方标准国家/地区代码。

您应该在res中创建两个文件夹,如下所示:

  

值(这是官方的)

     

values-rc(这将是具有讽刺意味的)

并在两个文件夹中放入一个string.xml。

  

官方(价值观)

<resources>
    <string name="name">Official</string>
</resources>
  

Ironic(values-rc)

<resources>
    <string name="name">Ironic</string>
</resources>

您可以通过此代码更改选择。

  public void updateCurrentContent(String currentContent) {
    try {
      Configuration config = new Configuration(getResources().getConfiguration());
      config.locale = new Locale(currentContent);
      getResources().updateConfiguration(config, getResources().getDisplayMetrics());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

这样当用户选择Official时,它将在values下显示来自strings.xml的get字符串,当用户选择Ironic时,它将在values-rc下获得字符串。

这样你就有了一个非常清晰的结构。唯一的缺点是您可能需要重新启动应用程序才能生效。

您可以使用此代码重新启动活动

Intent intent = getActivity().getIntent();
intent.putExtra("from_setting", true);
getActivity().finish();
startActivity(intent);