繁体   English   中英

无法访问类中的strings.xml资源

[英]Can"t acess to strings.xml resources in a class

我正在尝试访问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)at fr.package.notifications.EnvoieService.onHandleIntent(EnvoieService.java:96)at android.app.IntentService $ ServiceHandler.handleMessage(IntentService.java:65)at 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);
    }
}

没用

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

查看此答案如何在onCreate()之前在静态String上使用getString()?

获取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类(扩展Application类的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;
    }

从下面使用任一

context.getString(R.string.resource_name)

要么

application.getString(R.string.resource_name)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM