Установка текста в TextView вызывает исключение нулевого указателя

#java #android #nullpointerexception #textview

#java #Android #исключение nullpointerexception #textview

Вопрос:

Я только начинаю программировать на Android, и я столкнулся с этой ошибкой при попытке установить текст в TextView. Я исследовал проблемы других людей, но, похоже, позаботился о проблемах, на которые указывали их ответы.

Вот мой XML-код:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.everythingmath.MainActivity$PlaceholderFragment" >

<GridLayout
    android:id="@ id/problemLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:columnCount="5"
    android:rowCount="1" >

    <TextView 
        android:id="@ id/firstNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="First Number"
        android:textSize="20sp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="   "
        android:textSize="30sp" />

    <TextView 
        android:id="@ id/secondNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Second Number"
        android:textSize="20sp" />

    <EditText
        android:id="@ id/numTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number" 
        android:hint="Text Goes Here"
        android:textSize="20sp"/>

</GridLayout>
</RelativeLayout>
  

Вот моя соответствующая Java:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }

    int firstNumber = createRandomNumber(10);
    int secondNumber = createRandomNumber(10);
    TextView firstNumText = (TextView)findViewById(R.id.firstNumber);
    TextView secondNumText = (TextView)findViewById(R.id.secondNumber);
    firstNumText.setText(Integer.toString(firstNumber));
    secondNumText.setText(Integer.toString(secondNumber));
}
  

Ошибка возникает в строках, в которых я пытаюсь установить текст. Генератор случайных чисел также работает нормально.

Комментарии:

1. да activity_main.xml не имеет textview, он принадлежит фрагменту. Инициализируйте его в onCreateView фрагмента

2. как называется приведенный выше макет?

3. @DevCarlsberg Я предполагаю, что макет — это автоматически созданный фрагмент (fragment_main) из-за tools:context="com.example.everythingmath.MainActivity$PlaceholderFragment"

Ответ №1:

Локализуйте PlaceholderFragment класс внутри MainActivity класса.

Измените public View onCreateView метод на

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);

    int firstNumber = createRandomNumber(10);
    int secondNumber = createRandomNumber(10);
    TextView firstNumText = (TextView)findViewById(R.id.firstNumber);
    TextView secondNumText = (TextView)findViewById(R.id.secondNumber);
    firstNumText.setText(Integer.toString(firstNumber));
    secondNumText.setText(Integer.toString(secondNumber));

    return rootView;
}
  

Вероятно, вам потребуется переместить createRandomNumber метод в PlaceholderFragment класс. И в случае, если вы изменили имя фрагмента с fragment_main на что-то другое, измените его также в этой строке

 View rootView = inflater.inflate(R.layout.fragment_main, container, false);
  

Ваш текущий код не работает, потому что внутри

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    [..]
}
  

вы можете найти только по ID view ( findViewById ), который был объявлен внутри activity_main layout . И ваши TextView представления, вероятно, объявлены внутри fragment_main макета.