【问题标题】:Localizing strings in strings.xml gives NullPointerException在 strings.xml 中本地化字符串会产生 NullPointerException
【发布时间】:2013-04-28 01:41:20
【问题描述】:

由于与工作相关的问题,我安装了 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() 以便应用知道要显示的字符串的语言。但是 getResources() 让我很困惑。

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

【问题讨论】:

    标签: java android nullpointerexception localizable.strings getresource


    【解决方案1】:

    为了回答您的问题,您忘记初始化您的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)
    

    【讨论】:

    • 那么你是说我所要做的就是输入loading.setText(R.string.loading);,Android 会在运行时根据所使用设备的区域设置知道是输出英语还是西班牙语字符串?
    • 是的,如果您尊重我描述的层次结构,请阅读以下内容以获取更多信息:developer.android.com/training/basics/supporting-devices/…
    • 似乎都在正确编译。如果出现任何问题,我会更新。
    【解决方案2】:

    你有这个代码

    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 会根据设备的功能和设置自动处理。

    在你的布局定义中,你可以定义 text string 并引用一个字符串 id,Android 会自动加载相应的资源

    res/layout/splashscreen.xml:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多