【问题标题】:String resource is not passed to Static app Java class字符串资源未传递给静态应用 Java 类
【发布时间】:2020-02-02 19:16:21
【问题描述】:

我尝试了各种方式在这里询问和回答,但没有运气,例如: android how to use string resource in a java class

在一个 android 项目中,我有一个名为 configuration 的应用程序类,其中存储了几个静态变量并在我的活动等中使用。

为了一个

public static final String MYVARIABLE

我想根据本地化语言加载一个字符串值

values/strings.xml

我尝试过导入:

 import com.myappdomain.R

然后获取字符串

context.getString(R.string.my_string_in_values_xml)

这样:

String FORMYVARIABLE = context.getString(R.string.my_string_in_values_xml);

我也试过了:

String FORMYVARIABLE = 
getResources().getString(R.string.my_string_in_values_xml);

apk 编译没有错误,但在所有使用静态字符串的 java 活动中,该字符串未传递到产生致命异常的 java 类中。

有什么建议吗?我不想在我的类中使用额外的配置语言环境等,只是为了在 res/values/strings.xml 中设置一个已经以多种语言存在的字符串,除非没有其他方法,因为我想从那里添加/删除/编辑它们。

【问题讨论】:

标签: java android


【解决方案1】:

你可以试试

Resources.getSystem().getString(android.R.string.cancel)

【讨论】:

    【解决方案2】:

    试试下面,

    String s = getActivity().getResource().getString(R.string.my_string_in_values_xm);
    

    【讨论】:

    • 我认为 getActivity() 不存在
    【解决方案3】:

    您可以使用几种技术来解决这个问题。

    1.如果你真的想保留变量final,你可以在你的app类中创建一个静态资源变量。像这样:

    AndroidManifest.xml

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="x.x.x">
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        ....
    
    
        <application
            android:name=".MyApplication"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            ....
    

    MyApplication.java

    public class MyApplication extends MultiDexApplication {
    
        public static Resources resources;
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            resources=getResources();
        }
    

    实用程序.java

    public class Utility {
    
    
        public static final String TODAY_MUST_BE_BIG= MyApplication.resources.getString(R.string.today_must_be_bigger);
    

    2.如果不强制保留这些变量final,更好的解决方案是在Application 类或MainActivity 类中初始化它们。

    【讨论】:

    • 感谢您的开始,从您的示例中,我了解到我必须在所有使用 TODAY_MUST_BE_BIG 的活动中执行此操作,对吗?我有很多活动,使用它的类,这就是为什么我把它们都放在一个配置类中(我从一开始就计划我需要本地化)。我认为这将是一种更简单的方法。不过,我也会试试你的方法。
    • @qwertyg 一点也不!如果您遵循方法 1,则您已经拥有值 TODAY_MUST_BE_BIG 可供您使用。如果您遵循方法 2,则必须执行一次,因为值是静态的,只要您的应用没有停止,它就会一直存在。
    • 对不起,我明白了。以及如何解决 MultiDexApplication ?它不被识别
    • @qwertyg 在这里查看stackoverflow.com/a/27284064/7360848
    • 在我的情况下它不起作用,即使我包含 multidex 支持库也无法解决。另外,我使用的是 minSdkVersion 22,因此默认情况下应启用 MultiDexApplication,如下所述:developer.android.com/studio/build/multidex#mdex-gradle。但是,这种方法对我不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2011-10-23
    • 2019-08-11
    • 1970-01-01
    • 2015-02-13
    • 2017-04-18
    • 2014-10-03
    相关资源
    最近更新 更多