【问题标题】:Can"t acess to strings.xml resources in a class无法访问类中的 strings.xml 资源
【发布时间】:2016-08-18 08:32:19
【问题描述】:

我正在尝试访问我的 res/stringsxml 中的字符串值:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="fr">
    <string name="app_name">Solutis</string>
</resources>

这里我正在尝试调用:package fr.package;

公共类 SOAP 扩展应用程序{

String NAMESPACE;
String URL;
String SOAP_ACTION;

@Override
public void onCreate() {
    super.onCreate();
    NAMESPACE = getResources().getString(R.string.NAMESPACE);
    URL = getResources().getString(R.string.URL);
    SOAP_ACTION = getResources().getString(R.string.SOAP_ACTION);
}

private static String TAG = SOAP.class.getSimpleName();


public Reponse envoieDemande(String method, String xml) {
}
    }

错误:

08-18 04:21:18.839 27859-27874/? E/AndroidRuntime:致命异常: IntentService[EnvoieService] 进程:fr.package,PID:27859 java.lang.NullPointerException 在 android.content.ContextWrapper.getResources(ContextWrapper.java:89) 在 fr.package.SOAP.(SOAP.java:37) 在 fr.package.notifications.EnvoieService.onHandleIntent(EnvoieService.java:96) 在 android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:136) 在 android.os.HandlerThread.run(HandlerThread.java:61)

我如何调用 SOAP 类:

private class AsyncSoapCall extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        SOAP soap = new SOAP();
        //soap.envoieDemande("SendLead", xml);

        Reponse ret = soap.envoieDemande("SendLead", xml);
        System.out.println(ret.getCode() + ret.getMessage() + ret.getOption());

        if (ret.getCode().equals("1")) {
            GoogleAnalytics ga= new GoogleAnalytics(getActivity());
            ga.envoieTracker(idApplication, demandeId, logement, typeForm);
        }
        return null;
    }

编辑:在 onCreate() 中初始化

public class SOAP extends Application {

    String NAMESPACE;
    String URL;
    String SOAP_ACTION;

    @Override
    public void onCreate() {
        NAMESPACE = getResources().getString(R.string.NAMESPACE);
        URL = getResources().getString(R.string.URL);
        SOAP_ACTION = getResources().getString(R.string.SOAP_ACTION);
    }
}

没用

【问题讨论】:

  • 将此行String NAMESPACE = context.getResources().getString(R.string.app_name); 放入onCreate 之后 super.onCreate()
  • @Vucko 奇怪的是它在调试模式下没有进入 onCreate
  • 那是因为你有 2 个onCreate 方法,将一个与@Override 一起使用并删除另一个。
  • @Vucko 是的,我刚刚编辑,但它没有进入,请看我的编辑

标签: android string android-resources


【解决方案1】:

使用下面的任何一个

context.getString(R.string.resource_name)

application.getString(R.string.resource_name)

【讨论】:

    【解决方案2】:

    您不能从资源中初始化字段;该字段需要在初始化类时初始化,并且在运行时绑定应用程序资源之前发生。 (顺便说一句,您不能使用 Resources.getSystem() 的原因是您通过这种方式获得的 Resources 对象仅包含系统资源,而不包含任何应用程序资源。)

    看到这个答案How to use getString() on static String before onCreate()?

    获取 AppController 实例:

     String NAMESPACE;
     String URL;
     String SOAP_ACTION;
     private static SOAP mInstance;
    
        @Override
        public void onCreate() {
            super.onCreate();
            mInstance = this;
            NAMESPACE = getResources().getString(R.string.NAMESPACE);
            URL = getResources().getString(R.string.URL);
            SOAP_ACTION = getResources().getString(R.string.SOAP_ACTION);
    
        }
    
        public static synchronized SOAP getInstance() {
            return mInstance;
        }
    

    在您的 AppController 类中添加此字段和函数(扩展应用程序类的 AppController 类。在您的情况下将是肥皂)

    下次使用 getInstance() 方法获取 Soap 实例

    private class AsyncSoapCall extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            SOAP soap = SOAP.getInstance();
            //soap.envoieDemande("SendLead", xml);
    
            Reponse ret = soap.envoieDemande("SendLead", xml);
            System.out.println(ret.getCode() + ret.getMessage() + ret.getOption());
    
            if (ret.getCode().equals("1")) {
                GoogleAnalytics ga= new GoogleAnalytics(getActivity());
                ga.envoieTracker(idApplication, demandeId, logement, typeForm);
            }
            return null;
        }
    

    【讨论】:

    • 所以我可以在 onCreate 中初始化变量
    • 是的,它会工作,你必须在创建时初始化它
    • 你是否从外部 onCreate() 中删除了它
    • @Ben 添加 super.onCreate();在初始化之前在顶部的 onCreate() 方法中
    • 它应该可以工作我有一个类似的类扩展应用程序。我正在访问 getResources().getString();从那里开始,它在那里工作
    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 2017-09-19
    • 2012-11-05
    • 2015-07-17
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多