在strings.xml中本地化字符串会产生NullPointerException

时间:2013-05-03 15:29:44

标签: java android nullpointerexception localizable.strings getresource

安装Eclipse的我的工作计算机由于工作相关问题而没有互联网连接,因此所有代码和LogCat文本都是手动输入而不是复制和粘贴,因为我现在安装在Eclipse的单独笔记本电脑上。因此,请耐心等待任何错别字。

现在问题。在我的应用程序的新版本中,我正在支持西班牙语。我将所有字符串本地化为strings.xml。下面是我不想实现的Java代码。

public class SplashScreen extends SwarmActivity {

  Context c;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splashscreen);

    loading = (TextView)findViewById(R.id.loading);
    //loading.setText(c.getResources().setString(R.string.loading));  //This way gives NPE
    //loading.setText(R.string.loading);  //This way works
    //loading.setText("Test");  //This way works
  }
}

如果我正确理解localization,我必须首先获取getResources(),以便app知道要显示的字符串的语言。但getResources()正在搞砸我。

我需要做些什么才能正确显示字符串?

2 个答案:

答案 0 :(得分:2)

要回答您的问题,您忘了初始化Context object。所以c为空。更换 loading.setText(c.getResources().setString(R.string.loading)); 通过

loading.setText(getResources().setString(R.string.loading));

但实际上没有必要这样做。

Android在运行时根据设备的区域设置加载适当的资源。

您只需要尊重项目中的此层次结构:

res/
       values/
           strings.xml
       values-es / (here for spanish values)
           strings.xml
       values-fr /
           strings.xml (here for french values)

答案 1 :(得分:0)

您有此代码

Context c;

public void onCreate(Bundle savedInstanceState) {
    ...
    loading.setText(c.getResources().setString(R.string.loading));  //This way gives NPE

成员c在使用之前永远不会被设置。这就是NullPointerException的原因。您必须先使用View.getContext()初始化c

Localization会根据设备的功能和设置自动处理。

在您的布局定义中,您可以使用对字符串ID的引用来定义text string,Android会自动加载相应的资源

res/layout/splashscreen.xml

...
<TextView android:id="@+id/loading"
    android:text="@string/loading"
    .../>
...

因此无需在代码中明确设置文本字符串,因为Android已经这样做了。您唯一需要做的就是在res/values*/strings.xml文件中定义相应的文本字符串。