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

Java Android:定义日志名时引用字符串资源,java,android,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抱怨其中一个文件:

在我的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)进行静态引用 从类型上下文
-类型DatabaseManager的方法getText(int)未定义


我肯定我犯了一个非常明显的n00b错误,但我就是看不出来!感谢所有帮助:如果有任何其他代码片段需要帮助,请告诉我。

这是因为getText是
上下文的一种方法。导入上下文类并不重要;重要的是从上下文调用该方法(例如,活动类是上下文(它继承上下文))

在这种情况下,我建议创建一个返回所需上下文的应用程序类。之后,您可以执行以下操作:

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

根据所使用的“文件”类型,可以定义所使用的标记

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

假设我的应用程序名为“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");
    }
当为
SomeActivity
调用
onCreate()
时,输出将是

com.mydomain.Wibble.SomeActivity    Entered onCreate()...
com.mydomain.Wibble.SomeActivity    SomeText
com.mydomain.Wibble.SomeOtherActivity    Entered onCreate()...
com.mydomain.Wibble.SomeOtherActivity    SomeOtherText
…但是,当为
SomeOtherActivity
调用
onCreate()
时,输出将是

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

这两个活动都不需要通过显式字符串知道细节,并且包名是前缀。显然,它只在某些情况下有效,但我发现它很有用。

谢谢,这似乎很有效,我觉得我更好地理解了现在发生的事情。它唯一不起作用的地方是应用程序类本身:我以为我可以在那里使用getText(因为它是一个上下文),但是我得到了一个NullPointerException。有什么建议吗?由于这个问题,它开始工作了:事实证明,在onCreate之前,资源是不可访问的,所以我将我的日志名设置为静态的,而不是最终的,并将其设置在onCreate中,而不是在声明中。