Android:定义日志名称时引用字符串资源

时间:2011-01-02 22:46:57

标签: java android

在我的Android应用中,我想在多个文件中使用单个变量作为日志名称。目前,我在每个文件中单独指定它,例如

public final String LOG_NAME = "LogName";
Log.d(LOG_NAME, "Logged output);

我试过这个:

public final String LOG_NAME = (String) getText(R.string.app_name_nospaces);

虽然这通常适用于我的大多数文件,但Eclipse抱怨其中一个:

  

方法getText(int)未定义   对于DatabaseManager类型

我已经确定我肯定会在该文件中导入android.content.Context。如果我确切地告诉它在哪里找到getText:

  

此行的多个标记
     - 无法对非静态方法getText(int)进行静态引用   来自类型Context      - 类型DatabaseManager

的方法getText(int)未定义

我确定我犯了一个明显的n00b错误,但我看不到它!感谢您的帮助:如果任何其他代码段有用,请告诉我。

2 个答案:

答案 0 :(得分:2)

那是因为getText是Context的方法。如果导入Context类并不重要;重要的是你从一个Context 调用该方法(例如,Activity类是一个Context(它继承了Context))。

在这种情况下,我建议的是创建一个返回所需上下文的Application类。 Here I explain how to do it。之后,您可以执行以下操作:

public final String LOG_NAME = (String) App.getContext().getText(R.string.app_name_nospaces);

答案 1 :(得分:0)

根据您使用的“文件”类型,您可以定义使用的TAG。

例如,当我创建一个应用程序时,我喜欢为我的Activity类创建一个基类...

假设我的应用程序名为'Wibble',我的包是com.mydomain.Wibble ...我创建我的基本活动就像这样......

package com.mydomain.Wibble

public class WibbleActivity extends Activity {

    final protected String TAG = this.getClass().getName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // I'll explain how this next line works later
        android.util.Log.d(TAG, "Entered onCreate()...");
    }
}

现在假设我推导出一项活动如下......

package com.mydomain.Wibble

public class SomeActivity extends WibbleActivity {

    @Override
    protexted void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Don't Log "Entered onCreate()..." - WibbleActivity does it for me
        android.util.Log.d(TAG, "SomeText");
    }
}

然后我推导出另一个活动......

package com.mydomain.Wibble

public class SomeOtherActivity extends WibbleActivity {

    @Override
    protexted void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Don't Log "Entered onCreate()..." - WibbleActivity does it for me
        android.util.Log.d(TAG, "SomeOtherText");
    }

onCreate()调用SomeActivity时,输出将为...

com.mydomain.Wibble.SomeActivity    Entered onCreate()...
com.mydomain.Wibble.SomeActivity    SomeText

...当为onCreate()调用SomeOtherActivity时,输出将为......

com.mydomain.Wibble.SomeOtherActivity    Entered onCreate()...
com.mydomain.Wibble.SomeOtherActivity    SomeOtherText

两个活动都不需要通过显式字符串来了解细节,并且包名称是前缀的。显然它只会在某些情况下起作用,但我发现它很有用。