2011-06-07 69 views
1

我有奇怪的问题......奇怪的NullPointerException

我的文件的strings.xml包含:

​​

好了,我的R含有:

[...] 
public static final class String { 
    public static final int building_name=0x7f02383; 
} 
[...] 

所以,当我尝试调用这个字符串在我的代码是这样的:

private final String BUILDING_NAME = getString(R.string.building_name); 

我有这样的错误:

java.lang.RuntimeException: Unable to instanciate activity ComponentInfo{...}:   java.lang.NullPointerException 
{...} 
    caused by: java.lang.NullPointerException 

在{这里我实例化的building_name行}

这有什么错我的代码请帮助

+0

你有没有导入你的R类,而不是android.R类? – Egor 2011-06-07 07:39:03

+0

没关系我找到了解决方案,谢谢! (看看其他答案) – Greg 2011-06-07 09:06:48

回答

9

你不能叫getString您的活动已前初始化。这是因为getStringcontext.getResources().getString()相同。上下文未初始化。

所以基本上,你不能以这种方式给静态变量赋值。

但有一种方法可以在静态变量中使用资源字符串。为此,创建您的应用程序(请参阅thisthis),然后从中检索上下文。下面是一个简单的例子:

<manifest ...> 
    ... 
    <application android:name="com.mypackage.MyApplication" ... > 
     ... 
    </application> 
    ... 
</manifest> 

然后创建MyApplication.java文件:

public class MyApplication extends Application 
{ 
    private static MyApplication s_instance; 

    public MyApplication() 
    { 
     s_instance = this; 
    } 

    public static Context getContext() 
    { 
     return s_instance; 
    } 

    public static String getString(int resId) 
    { 
     return getContext().getString(resId);  
    } 
} 

,然后用它来获得字符串资源:

private final String BUILDING_NAME = MyApplication.getString(R.string.building_name); 

你甚至可以做到这一点杉静领域。

+0

+1,真棒 - 我自己得到了这个错误的一个版本。很好的解释。 – orip 2012-01-12 15:51:47

2

使用这可能帮助你

getResources().getString(R.string.building_name); 

这对我的作品

2

有一些情况下,发生这种情况,对于同你应该尝试一些步骤如下所述:

  1. 尝试清理你的项目。
  2. 检查是否导入了android.R类文件,如果导入了,然后将其删除并导入您的R类文件。
  3. 尝试使用getResources()。getString(R.string.myString)方法。