2017-09-29 3 views
1

J'ai une application d'enquête qui est implémentée à l'aide d'un viewpager et d'un arraylist de fragments. Les fragments ont des types de vue différents, certains ont des boutons radio, des boîtes d'entrée. Je veux enregistrer les données entrées dans une variable partagée dans l'activité parente lorsque l'utilisateur navigue d'un fragment à un autre. Lorsque l'utilisateur atteint le dernier fragment je veux afficher le résumé des données. Je pensais enregistrer les données lorsque l'utilisateur navigue d'un fragment à l'autre. Je ne sais pas non plus si c'est la meilleure façon de s'y prendre.Détecter que l'utilisateur balaie le fragment dans un viewpager

List<Question> questions = new SurveyServiceImpl(getApplicationContext()).getSurveyQuestions(1); 
    ArrayList<Fragment> questionFragments = new ArrayList<>(); 
    questionFragments.add(HomeFragment.newInstance("", "")); 
    for (int i = 0; i < questions.size(); i++) { 
     switch (questions.get(i).getQuestionType()) { 
      case SELECT: 
       if (questions.get(i).getMaximumOptionsRequired() == 1) 
        questionFragments.add(QuestionTypeSelect.newInstance("", questions.get(i))); 
       else 
        questionFragments.add(QuestionTypeCheckBox.newInstance("", questions.get(i))); 
       break; 
      case INPUT: 
       questionFragments.add(QuestionTypeInput.newInstance("", questions.get(i))); 
       break; 
      default: 
     } 
    } 
    questionFragments.add(EndFragment.newInstance("", "")); 
    final ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
    pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager(), questionFragments)); 

Répondre

0

Du haut de ma tête: Sauvegardez les données dès qu'il est modifié dans chaque fragment:
Pour EditTexts, utilisez TextWatcher: (example) pour enregistrer le texte lorsqu'il change en afterTextChanged().
Pour RadioButtons, utilisez radioButton.setOnClickListener (/ ** Enregistrer les données dans onClick * /) ou radioGroup.setOnCheckedChangeListener si vous utilisez un groupe radio (example).
Peut-être pas la solution la plus efficace, mais fonctionne :).

0

Utilisez OnPageChangeListener pour: tous les défilements; page centrée; changements de défilement de la page (démarrer le glisser, terminer l'animation du centre)

pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } 
     @Override public void onPageSelected(int position) { } 
     @Override 
     public void onPageScrollStateChanged(int state) { 
      if (state == ViewPager.SCROLL_STATE_DRAGGING) { 
//User started moving current page 
}}); 
0

Hmm. Eh bien, sauf si vous faites une sorte de cocher de sauvegarde le long du flux de l'assistant que vous voulez représenter que toutes les données de cette page ont été sauvegardées, je n'irais pas cette route personnellement. Vous pouvez facilement reconnaître que l'auditeur pageChanged

 vpMain.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      //Generated method stub 
     } 

     @Override 
     public void onPageSelected(int position) { 
      setCurrentPage(position); 
      PAGE_TO_RETURN_TO = position; 
      vpMain.setCurrentItem(PAGE_TO_RETURN_TO); 
      validate data and allow to scroll or save 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
      //Generated Method Stub 
     } 
    }); 

mais je préférerais voir OnPause() de l'activité mère poignée sauvegarde des données personnelles. Mais cela dépend vraiment de votre besoin pour l'application.