支持下拉和多语言的Android API Web服务

支持下拉和多语言的Android API Web服务,android,rest,drop-down-menu,Android,Rest,Drop Down Menu,探索是否有更好的方法来实现这一点,我目前的解决方案是: 我有一个Android应用程序,它需要通过API从服务器中提取数据,并显示在下拉列表中。示例数据是 id | text ---------- x | banana x | orange x | apple 我还需要有多语言支持。 使用Android Studio,我创建了一个staging和productionstrings.xml 在我的值strings.xml文件中,它包含: <string name="bana

探索是否有更好的方法来实现这一点,我目前的解决方案是:

我有一个Android应用程序,它需要通过API从服务器中提取数据,并显示在下拉列表中。示例数据是

 id | text
 ----------
 x  | banana
 x  | orange
 x  | apple
我还需要有多语言支持。 使用Android Studio,我创建了一个stagingproductionstrings.xml

在我的strings.xml文件中,它包含:

<string name="banana">Banana</string>
<string name="apple">Apple</string>
<string name="orange">Orange</string>
香蕉 苹果 橙色 以及值ms(与默认值不同的语言)strings.xml:

<string name="banana">pisang</string>
<string name="apple">epal</string>
<string name="orange">oren</string>
<string-array name="fruits_id">
    <item>2|@string/banana</item>
    <item>3|@string/orange</item>
    <item>4|@string/apple</item>
</string-array>
<string-array name="fruits_id">
    <item>1|@string/banana</item>
    <item>2|@string/orange</item>
    <item>3|@string/apple</item>
</string-array>
<string name="banana">pisang</string>
<string name="apple">epal</string>
<string name="orange">oren</string>
pisang
埃帕尔
奥伦
stagingstrings.xml中:

<string name="banana">pisang</string>
<string name="apple">epal</string>
<string name="orange">oren</string>
<string-array name="fruits_id">
    <item>2|@string/banana</item>
    <item>3|@string/orange</item>
    <item>4|@string/apple</item>
</string-array>
<string-array name="fruits_id">
    <item>1|@string/banana</item>
    <item>2|@string/orange</item>
    <item>3|@string/apple</item>
</string-array>
<string name="banana">pisang</string>
<string name="apple">epal</string>
<string name="orange">oren</string>

2 |@串/香蕉
3 |@string/橙色
4 |@string/苹果
生产strings.xml:

<string name="banana">pisang</string>
<string name="apple">epal</string>
<string name="orange">oren</string>
<string-array name="fruits_id">
    <item>2|@string/banana</item>
    <item>3|@string/orange</item>
    <item>4|@string/apple</item>
</string-array>
<string-array name="fruits_id">
    <item>1|@string/banana</item>
    <item>2|@string/orange</item>
    <item>3|@string/apple</item>
</string-array>
<string name="banana">pisang</string>
<string name="apple">epal</string>
<string name="orange">oren</string>

1 |@串/香蕉
2 |@string/橙色
3 |@string/苹果
请注意,字符串数组前面的数字是实际的数据库ID,不同的临时数据库和生产数据库可能有所不同,因此我将其拆分为不同的strings.xml文件

当用户从下拉列表中选择值“apple”时,我想根据用户的语言设置显示值,例如在本场景中显示“apple”或“epal”

如果这是一个生产场景,我的Web服务将向服务器返回值“3”

在这个页面中,它有10个下拉/微调器,因此我不希望在启动这个页面/活动时从API加载值,而是将我的可用选择硬编码到应用程序中


这是支持获取所选下拉选项的数据库id并同时使用多种语言的最有效方法吗?

我不会使用硬编码id。它们很难维护。我会做以下几点:

示例数据保持不变:

id | text
----------
x  | banana
x  | orange
x  | apple
在values strings.xml文件中:

<string name="banana">Banana</string>
<string name="apple">Apple</string>
<string name="orange">Orange</string>
加载所有微调器的数据并将其存储在某个位置:例如,在共享首选项中

dataList
然后根据接收到的数据创建MyItem列表:

final List<MyItem> myItemList = new ArrayList<MyItem>();
for (data in dataList) {
    myItemList.add(new MyItem(data.id, data.key, getString(data.key)));
}
现在您可以查看(并发送回服务器)所选的ID

selectedItem.id

到目前为止,您所做的还不错,但我建议您在项目gradle中创建两个不同的文件“staging”和“production”,而不是创建两个不同的文件“staging”和“production”。并将这两个文件放在适当的文件夹中,我可以向您保证,这两个ID将是相同的

注意,您必须基于buildVariant(flavor+buildtype)构建不同的APK

例如,如果您想要访问您的暂存文件,您必须构建一个单独的apk,这就是flavor的工作方式,我希望这就是您所寻找的

看看这个关于flaovrs的链接 (向下滚动一点查看味道) 最后但并非最不重要的是,看看这个

编辑:您必须在两种风味翻译中使用不同的副本,以匹配生产和登台“ID”

注意:此解决方案假定下拉列表(微调器)中的项目数在整个应用程序中保持不变

您应该做的是创建一个枚举作为微调器中每个项的模型

public enum Fruit {
 APPLE(R.string.apple), BANANA(R.string.banana), ORANGE(R.string.banana);
 @StringRes
 public int resId;
 @Override
 public String toString() {
    // you can use the application context here or 
    // can overload the toString as toString(Context)
    ctx.getString(resId);
 }
}
然后在
strings.xml中

<string name="apple">Apple</string>
<string name="banana">Banana</string>
<string name="orange">Orange</string>
<string-array name="fruits">
    <item>@string/banana</item>
    <item>@string/orange</item>
    <item>@string/apple</item>
</string-array>
<string name="banana">pisang</string>
<string name="apple">epal</string>
<string name="orange">oren</string>
在适配器(ArrayAdapter?)中使用
R.string.fruits
,并在填充视图时调用重写(或重载)的
toString
方法

现在,如果您需要在web服务中提供不同的值,您可以基于上面的代码提供
Fruit
enum的不同实现,它将立即运行,对i18n没有任何影响

参考文献:

  • 是否无法将翻译后的项目存储在数据库中?我认为您可以设置用户的语言偏好,然后在调用API时传递语言缩写,例如EN或RU。然后在后端,它将提取正确的数据并通过响应将其发送回。您可以有一个带有id列的表和许多语言列,只需查询id和语言值即可。我强烈建议不要将数据库的id公开为webservice的值。它通常会在将来引起更多的问题。@avinash在这种情况下,您将如何与用户选择的值的服务器通信?我最初认为ID是一个被索引的列(这意味着当我有10个表连接时,查询运行得更快),而不是按值查询数据库(例如select xxx from xx,其中name='apple')@simeh,您可以索引用于选择的字段。无论如何,这不是我的观点。关键是,如果您将API与数据库绑定在一起,就会产生一组新的问题。假设你明天要用无sql来支持你的业务逻辑,你希望自己如何在不改变Android应用的情况下带来改变?通过使用中间值,您可以自由使用任何后端。为了快速加载,我不希望在这个页面加载期间拉API请求。您的解决方案没有解决多语言支持的问题,我需要在用户选择Spinner的值后用他们的语言向用户显示多语言支持。在页面加载期间,您不必拉API请求。您可以将接收到的值存储在共享首选项中,并随时使用它们。我的版本也支持多种语言。我提到,您不必修改strings.xml文件。您的解决方案是将转换后的值存储在数据库中,而不是像上面伊佐迪尼提到的那样存储在Android中?不,不。我的建议是删除那些字符串数组项,而是创建一个类列表,并将它们用于微调器。其他一切都保持不变。请看我的最新答案。阿维纳什,你的解决方案和布莱希的有什么不同answer@simeh例如,它更干净(国际海事组织)。其次,它更容易维护。如果您希望完全从后端生成微调器(也是c),也可以使用blehi的答案