是否可以通过字符串名称而不是整数ID来获取资源?

10 浏览
0 Comments

是否可以通过字符串名称而不是整数ID来获取资源?

我想在我的资源文件res\values\strings.xml中为UI设置2种语言,并为它们分别设置字符串值:

Books
Quotes
Questions
Notes
Bookmarks
Книги
Цитаты
Вопросы
Заметки
Закладки

现在我需要在我的应用程序中动态检索这些值:

spec.setContent(R.id.tabPage1);
String pack = getPackageName();
String id = "tab_Books_" + Central.lang;
int i = Central.Res.getIdentifier(id, "string", pack);
String str = Central.Res.getString(i);

我的问题是i = 0

为什么在我的情况下不起作用?

0
0 Comments

有时候我们可能需要通过资源的字符串名称来获取资源,而不是通过资源的整数ID。这种需求可能出现在我们需要根据用户输入的字符串动态加载不同的资源,或者在运行时根据条件选择不同的资源等情况下。

在Android开发中,默认情况下,我们是通过资源的整数ID来获取资源的。但是,有时候我们可能希望能够通过资源的字符串名称来获取资源,这样可以更加灵活地操作资源。要实现这个功能,可以使用Android中的Resources类提供的getIdentifier()方法来实现。

上面的代码是一个示例,它实现了通过字符串名称获取资源的功能。这个函数接受两个参数,第一个参数是Context对象,第二个参数是资源的字符串名称。在函数内部,首先通过Context对象获取到Resources对象,然后使用Resources对象的getIdentifier()方法来获取资源的整数ID。getIdentifier()方法接受三个参数,第一个参数是资源的字符串名称,第二个参数是资源的类型(例如字符串资源是"string"类型),第三个参数是应用程序的包名。最后,使用Resources对象的getString()方法来获取资源的字符串值,并将其返回。

这样,我们就可以通过字符串名称来获取资源了。例如,如果我们有一个字符串资源的名称为"hello_world",我们可以调用上面的函数来获取这个字符串资源的值。

总结一下,通过字符串名称来获取资源可以提供更大的灵活性和扩展性。我们可以根据用户的输入或者其他条件来动态地加载不同的资源。使用Android中的Resources类提供的getIdentifier()方法可以实现这个功能。通过这个方法,我们可以根据字符串名称获取资源的整数ID,然后再使用Resources对象的其他方法来获取资源的值。这样,我们就可以根据字符串名称来获取资源了。

0
0 Comments

文章标题:通过字符串名称获取资源的可行性及解决方法

有时候我们可能需要通过字符串名称来获取资源,而不是通过整型ID来获取。这种需求的出现可能是因为数据文件中包含了一个自定义字符串,该字符串决定了应该显示哪个资源字符串,或者该字符串是从互联网获取的。下面是一个获取资源字符串的示例代码:

private String getStringResourceByName(String aString) {
    String packageName = getPackageName();
    int resId = getResources().getIdentifier(aString, "string", packageName);
    return getString(resId);
}

在使用这种方法时,我们需要确保`packageName`是正确的,它应该指向Android应用程序的根包。另外,要注意资源类型应为`string`而不是`strings`,这是符合逻辑的(就像Android的其他部分一样)。如果我们想通过字符串数组来获取资源,可以使用`res.getStringArray(R.array.planets_array)`来实现。官方文档提供了更多相关信息,可以参考链接:[developer.android.com/guide/topics/resources/string-resource.html#StringArray](http://developer.android.com/guide/topics/resources/string-resource.html#StringArray)。

如果我们想简化代码,可以将上述方法合并为一行代码:

String someStringFromXML = getString(getResources().getIdentifier("some_string_name", "string", getPackageName()));

当字符串是通过网络获取时,这种解决方法非常好用。例如,我们正在实现一个聊天功能,可以在设备之间传递系统消息。不同的设备可能使用不同的语言,因此接收设备上的消息必须以接收设备的语言显示。此时,通过字符串名称获取资源就非常有用了。

最后,别忘了处理可能出现的`Resources.NotFoundException`异常,否则可能会在后面的代码中遇到问题。

0
0 Comments

问题的出现原因是用户想知道是否可以通过字符串名称而不是整数ID来获取资源。解决方法是使用getResources().getString(R.string.mystring)来获取字符串资源。此外,Android框架可以通过为每种语言创建不同的文件夹来处理语言依赖性。用户只需将英语字符串放入res/values/strings.xml文件中,并创建一个名为values-ru的新文件夹,并将俄语字符串与相同的名称放入res/values-ru/strings.xml文件中。从此时起,Android会根据设备的区域设置自动选择正确的字符串资源。如果没有覆盖用户区域设置的文件夹,将使用res/values/strings.xml中的字符串作为默认值。用户还可以在android.support.v4.app.Fragment中直接调用getString(R.string.mystring)来获取字符串资源。用户对Google将获取字符串资源的方式设定为先获取字符串的整数ID,然后再通过该ID获取字符串感到困惑。实际上,字符串的名称和ID之间的映射关系存储在R.java文件中。用户需要确保使用的是项目的R而不是默认的Android R。对于动态通过名称访问字符串资源的需求,可以参考其他回答中提供的方法。

0