#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
макета.