Как правильно вывести текст на экран в android?

Учусь разрабатывать приложения на Java. Скажем так, моё приложение должно выводить число на экран. Для этого на экране был создан объект, в коде ему присваивалось значение переменной. По началу я не лез никуда, кроме GameActivity.java(код для acrivity_game.xml, которое я создал), и данные действия там проделывались следующим образом:

TextView textObjectPartA;
TextView textObjectPartB;

TextView textObjectPartA = (TextView)findViewById(R.id.textPartA);
TextView textObjectPartB = (TextView)findViewById(R.id.textPartB);

int partA = randInt.nextInt(numberRange);
partA++;
int partB = randInt.nextInt(numberRange);
partB++;

textObjectPartA.setText(""+partA);
textObjectPartB.setText(""+partB);

При запуске приложения и открытия, отладчик выдавал такую ошибку

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

Я смотрел обсуждение проблемы вот здесь, и делал, как указано в ответе:

Файл strings.xml

<string name="part_a">part a value = %1$d.</string>
<string name="part_b">part b value = %1$d.</string>

Файл activity_game.xml

<TextView
        android:id="@+id/textPartB"
        android:text="@string/part_b"
...
<TextView
        android:id="@+id/textPartA"
        android:text="@string/part_a"

GameActivity.java

 Resources res = getResources();
        String partA_text = String.format(res.getString(R.string.part_a), partA);
        textObjectPartA.setText(partA_text);
        String partB_text = String.format(res.getString(R.string.part_b), partB);
        textObjectPartB.setText(partB_text);

Также я пробовал простое решение - просто написать

textObjectPartA.setText(String.valueOf(partA));
textObjectPartB.setText(String.valueOf(partB));

Данная ошибка не исчезает. Программа также вылетает при попытке загрузить это Activity. Что я делаю не так?


Ответы (1 шт):

Автор решения: Andrew

После ознакомления с репой ТС стало понятно в чем проблема. Попробуйте использовать такой пример присваивания значение виджету :

public TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    textView = (TextView) view.findViewById(R.id.textView1);
    
}

Вы объявили один глобальный виджет в классе, а присвоили значение локальному. То есть у вас программа не понимает что это за виджеты:

TextView textObjectPartA;
TextView textObjectPartB;

в onCreate() уберите слово TextView:

textObjectPartA = (TextView)findViewById(R.id.textPartA);
textObjectPartB = (TextView)findViewById(R.id.textPartB);

и присвойте значение виджетам так как вы это сделали здесь:

textObjectScore = (TextView)findViewById(R.id.textScore);
textObjectLevel = (TextView)findViewById(R.id.textLevel);

и дальше вы сможете работать с глобальными виджетами из любого места в классе. И вероятнее всего ошибка исчезнет :)

→ Ссылка