Android:如何使用名称从资源中获取字符串?
我希望在我的资源文件 res\values\strings.xml
中为 UI 提供两种语言并为它们提供单独的字符串值:
<string name="tab_Books_en">Books</string>
<string name="tab_Quotes_en">Quotes</string>
<string name="tab_Questions_en">Questions</string>
<string name="tab_Notes_en">Notes</string>
<string name="tab_Bookmarks_en">Bookmarks</string>
<string name="tab_Books_ru">Книги</string>
<string name="tab_Quotes_ru">Цитаты</string>
<string name="tab_Questions_ru">Вопросы</string>
<string name="tab_Notes_ru">Заметки</string>
<string name="tab_Bookmarks_ru">Закладки</string>
现在我需要在我的应用程序中动态检索这些值:
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
。
为什么它在我的情况下不起作用?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
您所指的链接似乎适用于运行时生成的字符串。 strings.xml 中的字符串不是在运行时创建的。
您可以通过
getResources()
获取它们,它是
Context
类的一个方法。如果您位于Activity
或Service
(扩展了 Context)中,您可以像此代码片段中那样使用它。另外请注意,整个语言依赖关系可以由 android 框架来处理。
只需为每种语言创建不同的文件夹即可。如果英语是您的默认语言,只需将英语字符串放入
res/values/strings.xml
中即可。然后创建一个新文件夹values-ru
并将同名的俄语字符串放入res/values-ru/strings.xml
中。从这一点开始,当您调用 getString() 或通过 @string/mystring 引用 XML 中的字符串时,Android 会根据您的设备区域设置选择正确的字符串。来自
res/values/strings.xml
的值是后备值,如果您没有覆盖用户区域设置的文件夹,则该值将用作默认值。请参阅本地化和提供资源了解更多信息。
The link you are referring to seems to work with strings generated at runtime. The strings from strings.xml are not created at runtime.
You can get them via
getResources()
is a method of theContext
class. If you are inside aActivity
or aService
(which extend Context) you can use it like in this snippet.Also note that the whole language dependency can be taken care of by the android framework.
Simply create different folders for each language. If english is your default language, just put the english strings into
res/values/strings.xml
. Then create a new foldervalues-ru
and put the russian strings with identical names intores/values-ru/strings.xml
. From this point on android selects the correct one depending on the device locale for you, either when you callgetString()
or when referencing strings in XML via@string/mystring
.The ones from
res/values/strings.xml
are the fallback ones, if you don't have a folder covering the users locale, this one will be used as default values.See Localization and Providing Resources for more information.
验证您的 packageName 是否正确。您必须参考 Android 应用程序的根包。
Verify if your packageName is correct. You have to refer for the root package of your Android application.
不仅仅来自活动:
Not from activities only:
我会在 leonvian 的解决方案中添加一些内容,因此如果万一在资源中找不到该字符串(返回值 0,这不是有效的资源代码),该函数可能会返回一些内容:
I would add something to the solution of leonvian, so if by any chance the string is not found among the resources (return value 0, that is not a valid resource code), the function might return something :
最佳方法
App.getRes().getString(R.string.some_id)
将在任何地方工作(Utils,模型也)。
我已经阅读了所有答案,所有答案都可以帮助你完成工作。
Activity
或Fragment
中使用getString(R.string.some_string_id)
>。getString()
方法的情况下使用Context.getString(R.string.some_string_id)
。就像对话框
一样。出现问题
当您没有
Context
访问时,例如
Util
类中的方法。假设下面的方法没有上下文。现在,您将在此方法中将
Context
作为参数传递,并使用getString()。
我做什么
什么?在应用程序的任何地方使用都非常简单!
因此,这里有一个解决方案,您可以通过它从任何地方访问资源,例如
Util class
。将名称字段添加到 标记中。
manifest.xml
现在你可以走了。在应用程序中的任何位置使用
App.getAppResources().getString(R.string.some_id)
。Best Approach
App.getRes().getString(R.string.some_id)
Will work Everywhere (Utils, Models also).
I have read all the answers, all answers can make your work done.
getString(R.string.some_string_id)
in bothActivity
orFragment
.Context.getString(R.string.some_string_id)
where you don't have direct access togetString()
method. LikeDialog
.Problem
When you don't have
Context
access, like a method in yourUtil
class.Assume below method without Context.
Now you will pass
Context
as a parameter in this method and usegetString().
What i do is
What? It is very simple to use anywhere in your app!
So here is a solution by which you can access resources from anywhere like
Util class
.Add name field to your
manifest.xml
<application
tag.Now you are good to go. Use
App.getAppResources().getString(R.string.some_id)
anywhere in app.更简单的方法是在活动中使用 getString() 函数。
参考:http://developer.android.com/guide/topics/resources /string-resource.html
我认为这个功能是在最近的Android版本中添加的,任何了解历史的人都可以评论这一点。
Easier way is to use the
getString()
function within the activity.Reference: http://developer.android.com/guide/topics/resources/string-resource.html
I think this feature is added in a recent Android version, anyone who knows the history can comment on this.
getResources()
仅当您位于Activity
或Fragment
类中时才有效。请使用:
getResources()
works only when you're inActivity
orFragment
class.use:
如果您使用 Kotlin,您可以按如下方式定义扩展函数:
然后简单地使用它。例如,在 Puzzles 应用程序中,我根据图像文件名设置活动标题:
在本例中,我根据动态名称读取字符串资源。
In case you are using Kotlin, you can define an extension function as follows:
And then simply use it. For example, in a Puzzles app I set the Activity title according to the image file name:
In this example I am reading string resources based on dynamic names.
如果您没有 Activity 引用,您可以通过以下方式使用上下文:
If you don't have an Activity reference, you can use your context in this way:
如果您想在 Activity 或 Fragmnet 内部获取它,那么:
如果您想从 Activity 或 Fragmnet 之外的类获取它,而您没有 Activity 上下文,则使用应用程序上下文:
If you wannt get it inside an activity or fragmnet, then:
If you want to get it from a class outside of activity or fragment where you don't have the activity context then use application context:
在 Kotlin 中,利用扩展函数
In Kotlin, Leverage Extension functions ????
还有一组预定义的 Android 字符串,例如“Ok”、“Cancel”和许多其他字符串 - 因此您不必全部声明。它们只需通过以下方式即可获得:(
在本例中为“Ok”字符串)。顺便说一句,还有其他可用的 Android 资源,例如图标图像等。
There is also a set of predefined Android strings such as "Ok", "Cancel" and many others - so you don't have to declare all. They're available simply by:
(In this case, "Ok" string). BTW there are also other Android resources available like for example icons images etc.
String myString = getString(R.string.mystring);
简单的方法
String myString = getString(R.string.mystring);
easy way
您可以在活动中尝试此操作:
在其他情况下,例如片段,...使用
You can try this in an Activity:
In other situations like fragments,... use
为了安全起见,您应该添加:
mContext.getResources().getString(R.string.your_string);
mContext可以是:Fragment的onAttach()中的context或者Activity的this。
To safe, you should add:
mContext.getResources().getString(R.string.your_string);
mContext can be: context in onAttach() of Fragment or this of Activity.