Локализация строк в strings.xml дает NullPointerException

Мой рабочий компьютер, на котором установлен 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().

Что мне нужно сделать, чтобы строка отображалась правильно?


person Matt    schedule 03.05.2013    source источник


Ответы (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)
person Alexis C.    schedule 03.05.2013
comment
Итак, вы говорите, что все, что мне нужно сделать, это поставить loading.setText(R.string.loading);, и Android будет знать во время выполнения на основе региональных настроек используемого устройства, следует ли выводить английскую или испанскую строку? - person Matt; 03.05.2013
comment
Да, если вы уважаете иерархию, которую я описал, прочитайте это для получения дополнительной информации: developer.android.com/training/basics/support-devices/ - person Alexis C.; 03.05.2013
comment
Вроде все правильно компилируется. Если возникнут какие-либо заминки, я обновлю. - person Matt; 03.05.2013

У вас есть этот код

Context c;

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

Элемент c никогда не устанавливается до того, как он будет использован. Это причина для NullPointerException. Сначала необходимо инициализировать c с помощью, например, View.getContext(). .

Локализация выполняется автоматически в соответствии с возможностями и настройками устройства.

В определении макета вы можете указать текстовую строку. со ссылкой на строковый идентификатор, и Android автоматически загрузит соответствующий ресурс

In res/layout/splashscreen.xml:

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

Таким образом, нет необходимости явно задавать текстовую строку в вашем коде, потому что Android уже сделает это. Единственное, что вам нужно сделать, это определить соответствующие текстовые строки в файлах res/values*/strings.xml.

person Olaf Dietsche    schedule 03.05.2013