Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何使用字符串的名称从资源中获取字符串?_Android_String_Resources - Fatal编程技术网

Android:如何使用字符串的名称从资源中获取字符串?

Android:如何使用字符串的名称从资源中获取字符串?,android,string,resources,Android,String,Resources,我想在我的资源文件res\values\strings.xml中为UI设置两种语言,并为它们设置单独的字符串值: 我的问题是i=0 为什么它在我的例子中不起作用?您所指的链接似乎与运行时生成的字符串一起工作。strings.xml中的字符串不是在运行时创建的。 你可以通过 String mystring = getResources().getString(R.string.mystring); getResources()是Context类的一个方法。如果您在活动或服务(扩展上下文)中,

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

我的问题是
i=0


为什么它在我的例子中不起作用?

您所指的链接似乎与运行时生成的字符串一起工作。strings.xml中的字符串不是在运行时创建的。 你可以通过

String mystring = getResources().getString(R.string.mystring);
getResources()
Context
类的一个方法。如果您在
活动
服务
(扩展上下文)中,可以像在本代码段中一样使用它

另外请注意,整个语言依赖性可以由android框架来处理。 只需为每种语言创建不同的文件夹。如果英语是默认语言,只需将英语字符串放入
res/values/strings.xml
。然后创建一个新文件夹
values ru
,并将同名的俄语字符串放入
res/values ru/strings.xml
。从这一点开始,android会根据您的设备区域设置选择正确的一个,无论是在您调用
getString()
时,还是在通过
@string/mystring
引用XML中的字符串时。
res/values/strings.xml
中的文件是备用文件,如果没有覆盖用户区域设置的文件夹,则此文件将用作默认值


有关更多信息,请参阅和。

验证您的packageName是否正确。您必须参考Android应用程序的根包

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

我想在leonvian的解决方案中添加一些内容,因此如果在资源中没有找到字符串(返回值0,这不是有效的资源代码),函数可能会返回一些内容:

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

更简单的方法是在活动中使用
getString()
函数

String myString = getString(R.string.mystring);
参考:


我认为这项功能是在最近的Android版本中添加的,任何了解历史的人都可以对此发表评论。

这是一种将资源字符串从字符串获取到文本视图的简单方法。此处resourceName是资源的名称

int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);

不仅仅是活动:

    public static String getStringByIdName(Context context, String idName) {
        Resources res = context.getResources();
        return res.getString(res.getIdentifier(idName, "string", context.getPackageName()));
    }

如果您没有活动引用,可以通过以下方式使用您的上下文:

getContext().getString(R.string.your_string_name);

还有一组预定义的Android字符串,例如“Ok”、“Cancel”和许多其他字符串,因此您不必声明所有字符串。可通过以下方式获得:

getString(android.R.string.ok)

(在本例中为“Ok”字符串)。顺便说一句,还有其他Android资源可用,例如图标、图像等。

String myString=getString(R.String.myString)

简易方法

最佳方法
App.getRes().getString(R.string.some\u id)

将在任何地方工作(UTIL、模型也适用)。 我已经阅读了所有的答案,所有的答案都能让你完成工作

  • 您可以在
    活动
    片段
    中使用
    getString(R.string.some\u string\u id)
  • 您可以使用
    Context.getString(R.string.some\u string\u id)
    而不直接访问
    getString()
    方法。像
    对话框
问题 当您没有
上下文
访问权限时,就像
Util
类中的方法一样

假设下面的方法没有上下文

public void someMethod(){
    ...
    // can't use getResource() or getString() without Context.
}
现在,您将在该方法中将
Context
作为参数传递,并使用
getString()

我所做的是

public void someMethod(){
    ...
    App.getAppResources().getString(R.string.some_id)
}
什么?在应用程序中的任何位置使用都非常简单

因此,这里有一个解决方案,通过它,您可以从任何地方访问资源,如
Util类

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static Resources resources;

    @Override
    public void onCreate() {
        super.onCreate();

        resources = getResources();
    }

    public static Resources getAppResources() {
        return resources;
    }

}
将名称字段添加到您的
manifest.xml
要安全,您应该添加:
mContext.getResources().getString(R.string.your_string)


mContext可以是:片段的onAttach()中的上下文,也可以是活动的上下文。

您可以在活动中尝试:

getResources().getString(R.string.your string name);
在其他情况下,如碎片,。。。使用

getContext().getResources().getString(R.string.your string name);

如果您不想在活动或fragmnet中获取它,那么:

getContext().getResources().getString(R.string.string_name);
如果您想从活动或片段之外的类中获取它,而您没有活动上下文,那么请使用应用程序上下文:

getApplicationContext().getResources().getString(R.string.string_name);
R.string。

直接在java文件中使用该行。保持简单。

如果您使用的是Kotlin,您可以定义如下扩展函数:

fun Context.getStringResourceByName(stringName: String): String? {
    val resId = resources.getIdentifier(stringName, "string", packageName)
    return getString(resId)
}
然后简单地使用它。例如,在拼图应用程序中,我根据图像文件名设置活动标题:

val stringName = "${folderName}_${assetName.substringBefore(".")}"
title = getStringResourceByName(stringName)
在本例中,我读取的是基于动态名称的字符串资源。

getResources()
仅当您在
活动
片段
类中时才起作用

  • 要随时随地访问字符串资源
使用:


您确定Central.lang是
en
还是
ru
?需要更多信息来检查您的代码。在获得i之前,每个var的状态是什么?无论如何,你应该使用Android中默认的本地化支持来保持简单。相关帖子-以防有人有充分的理由这样做(例如,数据文件包含一个自定义字符串,该字符串决定应该显示哪个资源字符串,或者该字符串是否从Internet获取)--那么我想指出这个解决方案是正确的。特别是纠正资源类型为
string
而不是
strings
的部分。因为这是合乎逻辑的(就像其他Android一样)。所以,谢谢你(还有更多),@leonvian.:-)@Sameer通过字符串获取数组只需使用:res.getStringArray(R.array.planets\u数组);看看这个官方链接:酷。为了摆脱单独的方法声明,可以这样“简化”它:
String someStringFromXML=getString(getResources().getIdentifier(“some_String_name”,“String”,getPackageName())。谢谢!当字符串获取f时,这是一个很好的解决方案
getContext().getResources().getString(R.string.your string name);
getContext().getResources().getString(R.string.string_name);
getApplicationContext().getResources().getString(R.string.string_name);
R.string.<string_name>
fun Context.getStringResourceByName(stringName: String): String? {
    val resId = resources.getIdentifier(stringName, "string", packageName)
    return getString(resId)
}
val stringName = "${folderName}_${assetName.substringBefore(".")}"
title = getStringResourceByName(stringName)
Resources.getSystem().getString(android.R.string.somecommonstuff)