#java #android #android-fragments #nullpointerexception #fragment
#java #Android #android-фрагменты #исключение nullpointerexception #фрагмент
Вопрос:
Я хотел бы создать кнопку, MainActivity.java
например, в другом фрагменте.
Чтобы быть немного более понятным, у меня есть действие, которое содержит 3 фрагмента, я хочу создать кнопку из фрагмента 2 в этом действии. Но при попытке их инициализации я получаю исключение нулевого указателя.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
if (savedInstanceState == null) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.scoreFragment, new ScoreFragment());
fragmentTransaction.add(R.id.questionFragment, new QuestionFragment());
fragmentTransaction.add(R.id.navigationFragment, new NavigationFragment());
//creates the questions
questions = new ArrayList<Question>();
currentQuestion = new Question("correct");
questions.add(currentQuestion);
fragmentTransaction.commit();
//here is where the null pointer exception appears.
QuestionFragment q = (QuestionFragment) fragmentManager.findFragmentById(R.id.questionFragment);
//View v = q.;
initialize(q);
}
//Button nextQuestionButton = (Button) findViewById(R.id.next);
//nextQuestionButton.setEnabled(false);
}
/* WHY DOESNT IT WORK? */
private void initialize(QuestionFragment q){
View v=q.getView();
buttons[0] = (Button) v.findViewById(R.id.button1);
buttons[1] = (Button) v.findViewById(R.id.button2);
buttons[2] = (Button) v.findViewById(R.id.button3);
buttons[3] = (Button) v.findViewById(R.id.button4);
//loads possible answers from array
Resources res = getResources();
String[] answers = res.getStringArray(R.array.questionBank);
//creates a random number between 0 and 3 that button is correct and the others are incorrect
Random rand = new Random();
int correct = rand.nextInt(4);
buttons[correct].setText(answers[0]);
buttons[(correct 1) % 4].setText(answers[1]);
buttons[(correct 2) % 4].setText(answers[2]);
buttons[(correct 3) % 4].setText(answers[3]);
}
Я заставил его работать, если я создаю кнопки в QuestionFragment
in onCreateView
, но я хотел бы попытаться заставить его работать в QuizActivity
, который содержит 3 фрагмента.
Как я могу это сделать?
Комментарии:
1. Почему вы хотите сделать это в действии. Фрагменты должны обрабатывать свои собственные функции.
Ответ №1:
Попробуйте переопределить onCreateView в классе QuestionFragment и выполнить инициализацию пользовательского интерфейса QuestionFragment там, а не пытаться управлять им с уровня активности.
Кроме того, в вашем примере выше, если FragmentManager.findFragmentById(R.id.questionFragment) возвращает null, это означает, что фрагмент не был добавлен / не существует.
Комментарии:
1. я на самом деле инициализировал соответствующий класс фрагмента пользовательского интерфейса, и он сработал, но я не уверен, что это правильный способ сделать это. кроме того, я хочу знать причину, по которой она не работает в MainActivity.
2. Это правильный способ сделать это. В общем, думайте о фрагменте как о подактивности: вся логика, которая может содержаться или инкапсулироваться во фрагменте, должна идти туда, а не Действие. Если вы не будете следовать этому шаблону, то вся ваша логика будет привязана к этому действию, и вы не сможете легко повторно использовать фрагмент в другом действии (что сводит на нет всю цель фрагментов).