Попытка доступа к методу фрагмента из родительской активности в viewpager - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть действие под названием CBT_practice , в котором хранятся фрагменты: target_fragment , subjective_fragment и history_fragment .Эти фрагменты добавляются в действие динамически с помощью viewpager.

Но у меня есть проблема с target_fragment после его добавления в viewpager.Родительское действие (CBT_practice) использует LoaderManager для создания запроса sqlite db для получения списка вопросов, после чего фрагмент получает доступ к фрагменту в его жизненном цикле onCreateView и затем сохраняется в переменной.

Однако только после того, как я свернул и восстановил экран телефона (т. Е. Когда действие было приостановлено, а затем возобновлено), и я попытался вызвать метод в файлеjective_fragment (getScore()) из родительского действия (CBT_practice)при нажатии кнопки я получаю сообщение об ошибке, в котором говорится, что размер списка равен 0. Этого не происходит, когда я не минимизирую и не восстанавливаю действие

Список получен из родительского действия и назначенв методе OnCreateView

После приостановки и возобновления действия listSize возвращает 60 в методе OnCreateView, но 0 в getScore() методе

ThisУдивительно, поскольку список был сохранен в глобальной переменной, а затем назначен в методе onCreateView

. Вот обратный вызов загрузчика родительской активности, который получает список вопросов из db:

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        progressBarLN.setVisibility(View.GONE);
        data.moveToFirst();

        while(!data.isAfterLast()){

            id = data.getString(data.getColumnIndex("_id"));
            topic_id_selected = data.getString(data.getColumnIndex("topic_id"));
            year_id_selected = data.getString(data.getColumnIndex("year_id"));
            ques_num = data.getString(data.getColumnIndex("question_num"));
            ques = data.getString(data.getColumnIndex("question"));
            ans = data.getString(data.getColumnIndex("answer"));
            ans_desc = data.getString(data.getColumnIndex("answer_desc"));
            opt_ans_id = data.getString(data.getColumnIndex("option_answer_id"));
            opt_1 = data.getString(data.getColumnIndex("option_A"));
            opt_2 = data.getString(data.getColumnIndex("option_B"));
            opt_3 = data.getString(data.getColumnIndex("option_C"));
            opt_4 = data.getString(data.getColumnIndex("option_D"));
            opt_5 = data.getString(data.getColumnIndex("option_E"));
            ques_type_id = data.getString(data.getColumnIndex("question_type_id"));
            selected_ans_id = data.getString(data.getColumnIndex("selected_answer_id"));

            QuestionAnswerList ques_item = new QuestionAnswerList(ques_num, ques, ans, ans_desc, opt_ans_id, opt_1, opt_2, opt_3,
                    opt_4, opt_5, ques_type_id, selected_ans_id, topic_id_selected, year_id_selected);
            topic_name = get_topic_name(topic_id_selected);
            ques_item.set_topic_name(topic_name);
            if(ques_item.opt_1!=null && ques_item.opt_2!=null && ques_item.opt_3!=null)
                ques_item.setOptions(isShuffleOpt);
            ques_ans_list.add(ques_item);
            //ques_ans_list contains the list of questions retrieved from the db
            data.moveToNext();

        }


        if(isShuffleQues) Collections.shuffle(ques_ans_list);
        viewPager = (ViewPager)findViewById(R.id.viewpager);
        //viewPager.setOffscreenPageLimit(ques_type_count);
        setUpViewPager(viewPager, ques_type);

        tabLayout = (TabLayout)findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

    }

Вот код в родительской активности, который вызывает метод getScore () после нажатия кнопки

//get the objective_fragment
Fragment fragment = adapter.getItem(0);

//calls the getScore() method
((obj_fragment) fragment).getScore();

Вот фрагмент OnCreateView

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            setHasOptionsMenu(true);

                View view = inflater.inflate(R.layout.fragment_obj_tv, container, false);
                preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);


                quesNoTV = (TextView) view.findViewById(R.id.quesNoTV);
                webView = (TextView) view.findViewById(R.id.webview);

                rad1 = (RadioButton) view.findViewById(R.id.opt1);
                rad2 = (RadioButton) view.findViewById(R.id.opt2);
                rad3 = (RadioButton) view.findViewById(R.id.opt3);
                rad4 = (RadioButton) view.findViewById(R.id.opt4);
                rad5 = (RadioButton) view.findViewById(R.id.opt5);
                radGrp = (RadioGroup) view.findViewById(R.id.radiogroup);


                rad1.setOnClickListener(radClickListener);
                rad2.setOnClickListener(radClickListener);
                rad3.setOnClickListener(radClickListener);
                rad4.setOnClickListener(radClickListener);
                rad5.setOnClickListener(radClickListener);

                submit = (Button) view.findViewById(R.id.submit);

                next.setOnClickListener(clickListener);
                previous = (Button) view.findViewById(R.id.previous);

                previous.setOnClickListener(clickListener);


                //getting the parent activity
                activity = (CBT_Practice) getActivity();

              //assigning the list from the parent activity to the fragment ques_list variable
                ques_list = activity.ques_ans_list;

                //listSize here is 60
                listSize = ques_list.size();
                ques_obj = ques_list.get(startIndex);
                show_question(ques_obj);



            return view;
        }

Вот фрагментgetScore() method

    public int getScore(){
        Intent intent;
        Bundle args = new Bundle();
        ArrayList<QuestionAnswerList> casted_list = new ArrayList<>(ques_list);
        int correct = 0;
        for(QuestionAnswerList item : ques_list){
            if(item.getPicked_ans_id()==item.get_shuffle_ans_id()&&item.getPicked_ans_id()!=-1) correct = correct+1;
        }
        int num = correct;
        correct = (correct*100)/listSize;
        //listSize here is 0


        if(activity.ques_type.get(0).equals("0")) {
            intent = new Intent(getActivity(), ResultActivity.class);
            args.putInt("score", correct);
            args.putInt("numOfQues", objective_list.size());
            args.putInt("correct", num);
        }
        else
            intent = new Intent(getActivity(), Answers.class);




        args.putStringArrayList("types", new ArrayList<>(activity.ques_type));
        args.putParcelableArrayList("list", casted_list);
        intent.putExtras(args);
        getActivity().startActivity(intent);
        return correct;
    }

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

...