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

这篇博客讨论了在Android应用中如何根据资源名称动态获取字符串资源,包括在不同场景下使用上下文或活动来获取字符串的方法。文章指出,可以通过`getString()`方法结合资源ID或者资源名称来实现,并提供了多种在没有直接上下文访问的情况下获取字符串的解决方案。
摘要由CSDN通过智能技术生成

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

<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

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


#1楼

我也有同样的问题。 但是下面的代码对我有用:验证您的packageName是否正确。 您必须参考Android应用程序的根软件包。

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

#2楼

我会在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);
    }
}

#3楼

getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))

#4楼

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

String myString = getString(R.string.mystring);

参考: http : //developer.android.com/guide/topics/resources/string-resource.html

我认为此功能是在最新的Android版本中添加的,任何知道历史的人都可以对此发表评论。


#5楼

一种将资源字符串从字符串转换为TextView的简单方法。 这里resourceName是资源的名称

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

#6楼

不仅来自活动:

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

#7楼

如果没有活动参考,则可以通过以下方式使用上下文:

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

#8楼

还有一组预定义的Android字符串,例如“ Ok”,“ Cancel”以及许多其他字符串 -因此您不必全部声明。 可以通过以下方式简单地获得它们:

getString(android.R.string.ok)

(在这种情况下,为“ Ok”字符串)。 顺便说一句,还有其他可用的Android资源,例如图标图像等。


#9楼

字符串myString = getString(R.string.mystring);

简单的方法


#10楼

最佳方法

App.getRes().getString(R.string.some_id)

可以在所有地方使用(实用程序,模型也可以)。

我已经阅读了所有答案,所有答案都可以帮助您完成工作。

  • 您可以在ActivityFragment使用getString(R.string.some_string_id)
  • 您可以在没有直接访问getString()方法的地方使用Context.getString(R.string.some_string_id) 。 像Dialog一样。

问题

您没有Context访问权限时 ,就像Util类中的方法一样。

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

public void someMethod(){
    ...
    // can't use getResource() or getString() without Context.
}

现在,您将在此方法中将Context作为参数传递,并使用getString().

public void someMethod(Context context){
    ...
    context.getString(R.string.some_id);
}

我要做的是

public void someMethod(){
    ...
    App.getAppResources().getString(R.string.some_id)
}

什么? 在您的应用程序中的任何地方使用非常简单!

因此,这里是一个解决方案 ,您可以通过该解决方案Util class等任何地方访问资源。

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 <application标签。

<application
        android:name=".App"
        ...
        >
        ...
    </application>

现在你很好。 在应用程序中的任何位置使用App.getAppResources().getString(R.string.some_id)


#11楼

为了安全起见,您应该添加:mContext.getResources()。getString(R.string.your_string);

mContext可以是:Fragment的onAttach()或Activity的上下文。


#12楼

您可以在活动中尝试:

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

在其他情况下,例如碎片,...使用

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

#13楼

如果您希望将其放入活动或fragmnet中,则:

getContext().getResources().getString(R.string.string_name);

如果要从没有活动上下文的活动或片段之外的类中获取它,请使用应用程序上下文:

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

#14楼

您引用的链接似乎可以在运行时生成的字符串中使用。 strings.xml中的字符串不是在运行时创建的。 你可以通过

String mystring = getResources().getString(R.string.mystring);

getResources()Context类的方法。 如果您在ActivityService (扩展了Context)中,则可以在此代码段中使用它。

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

有关更多信息,请参见本地化提供资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值