Не удается создать кнопку в основном действии из фрагмента?

#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. Это правильный способ сделать это. В общем, думайте о фрагменте как о подактивности: вся логика, которая может содержаться или инкапсулироваться во фрагменте, должна идти туда, а не Действие. Если вы не будете следовать этому шаблону, то вся ваша логика будет привязана к этому действию, и вы не сможете легко повторно использовать фрагмент в другом действии (что сводит на нет всю цель фрагментов).