簡體   English   中英

Android庫中的string.xml

[英]string.xml in Android library

我在 android 應用程序的庫中工作,我正在嘗試使用 string.xml 為用戶在關鍵點中放置一些消息。

我的問題是當我在 android 測試應用程序中測試庫以查看工作流程並到達我顯示一條消息(在本例中為日志)時,該消息發生致命錯誤和應用程序崩潰。

我在想與測試應用程序中的string.xml發生沖突並覆蓋我在庫中的string.xml 這可以通過某種方式解決,還是我強行使用測試應用程序 string.xml 來鍛煉圖書館?

我是否必須讓我的 class 從 Activity 擴展以使用 getResources()? 或者是訪問 string.xml 的任何其他方式,我將留下代碼和日志。

代碼

public void createCertificateLogTxt(){
    File certificado = new File (this.KeyFolderContainer.getAbsoluteFile(),"certificadoLog.txt");
    if(!certificado.exists()){
        try {
            certificado.createNewFile();
            this.CertificadoLog = certificado;
            Log.i(LOGFILE, "certificadoLog.txt Creado"+ this.getResources().getString(R.string.app_name));
        } catch (IOException e) {
            Log.e(LOGFILE, "No se puede crear certificadoLog.txt"+ R.string.LOGFILE, e);
        }
    }

日志

09-14 02:41:24.032: I/Choreographer(23748): Skipped 105 frames!  The application may be doing too much work on its main thread.
09-14 02:41:25.593: D/AndroidRuntime(23748): Shutting down VM
09-14 02:41:25.593: W/dalvikvm(23748): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
09-14 02:41:25.753: E/AndroidRuntime(23748): FATAL EXCEPTION: main
09-14 02:41:25.753: E/AndroidRuntime(23748): java.lang.IllegalStateException: Could not execute method of the activity
09-14 02:41:25.753: E/AndroidRuntime(23748):    at android.view.View$1.onClick(View.java:3633)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at android.view.View.performClick(View.java:4240)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at android.view.View$PerformClick.run(View.java:17721)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at android.os.Handler.handleCallback(Handler.java:730)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at android.os.Handler.dispatchMessage(Handler.java:92)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at android.os.Looper.loop(Looper.java:137)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at android.app.ActivityThread.main(ActivityThread.java:5103)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at java.lang.reflect.Method.invokeNative(Native Method)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at java.lang.reflect.Method.invoke(Method.java:525)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at dalvik.system.NativeStart.main(Native Method)
09-14 02:41:25.753: E/AndroidRuntime(23748): Caused by: java.lang.reflect.InvocationTargetException
09-14 02:41:25.753: E/AndroidRuntime(23748):    at java.lang.reflect.Method.invokeNative(Native Method)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at java.lang.reflect.Method.invoke(Method.java:525)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at android.view.View$1.onClick(View.java:3628)
09-14 02:41:25.753: E/AndroidRuntime(23748):    ... 11 more
09-14 02:41:25.753: E/AndroidRuntime(23748): Caused by: java.lang.NullPointerException
09-14 02:41:25.753: E/AndroidRuntime(23748):    at android.content.ContextWrapper.getResources(ContextWrapper.java:89)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:78)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at com.idyseg.movilsecure.files.KeyFileManager.createCertificateLogTxt(KeyFileManager.java:76)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at com.idyseg.movilsecure.MSMasterControler.<init>(MSMasterControler.java:34)
09-14 02:41:25.753: E/AndroidRuntime(23748):    at com.idyseg.librerytester.MainActivity.Conector(MainActivity.java:33)
09-14 02:41:25.753: E/AndroidRuntime(23748):    ... 14 more
09-14 02:41:28.253: I/Process(23748): Sending signal. PID: 23748 SIG: 9

我認為問題 - 或至少部分問題 - 是您試圖在 Activity 的構造函數期間調用this.getResources() ,如堆棧跟蹤中的這一行所示:

09-14 02:41:25.753: E/AndroidRuntime(23748):    at com.idyseg.movilsecure.MSMasterControler.<init>(MSMasterControler.java:34)

據我所知,在調用 Activity 的onCreate方法之前,資源不可用。 嘗試createCertificateLogTxt的調用移動到您的 Activity 的onCreate方法。

此外,如果您將KeyFileManager類定義為 Activity 以便您可以在其上調用getResources ,那么這也是問題的一部分:如果它沒有被用作Activity(也就是說,如果它不使用標准 Activity lifecyle 方法),那么資源將再次無法通過此類獲得。 在這種情況下,您要修改KeyFileManager.createCertificateLogTxt()以將主 Activity 的 Context 作為參數傳遞:

KeyFileManager.createCertificateLogTxt(Context context) {
   //....
              Log.i(LOGFILE, "certificadoLog.txt Creado"+ context.getResources().getString(R.string.app_name));
}

順便說一句:雖然這並不重要,但這一行:

        Log.e(LOGFILE, "No se puede crear certificadoLog.txt"+ R.string.LOGFILE, e);

對我來說看起來很可疑; 你不想要這樣的東西嗎?

        Log.e(LOGFILE, "No se puede crear certificadoLog.txt " + getString(R.string.LOGFILE), e);

我知道幾年前有人問過這個問題,但最近由於 Android Studio 的進步,我找到了一個更可行的解決方案。

在創建模塊時,大多數時候,我們忘記更新模塊清單,因為當我們的用例模塊中沒有<activity>時我們很少使用它。 但是,如果我們想使用像strings.xml or drawables這樣的資源文件,我們需要在我們的 Manifest 中定義 package,否則,我們無法使用模塊res目錄中的任何資源。

像這樣,

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourpackagename">      <!-- this line -->

</manifest>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM