简体   繁体   English

检测用户是否正在从ViewPager中的片段上滑动

[英]Detect that the user is swiping away from the fragment in a viewpager

I have a survey app which is implemented using a viewpager and an arraylist of fragments. 我有一个使用viewpager和片段数组列表实现的调查应用程序。 The fragments have different view types, some have radio buttons, some input boxes. 这些片段具有不同的视图类型,一些具有单选按钮,一些输入框。 I want the save the entered data to a shared variable in the parent activity when the user navigates from one fragment to another. 当用户从一个片段导航到另一个片段时,我希望将输入的数据保存到父活动中的共享变量中。 When the user reaches the last fragment i want to display the summary of the data. 当用户到达最后一个片段时,我想显示数据摘要。 i was thinking of saving the data when the user navigates from one fragment to the next. 当用户从一个片段导航到另一个片段时,我正在考虑保存数据。 Also not sure if it is the best way to go about it. 也不确定这是否是最好的方法。

    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));

Off the top of my head: Save the data as soon as it is changed in each fragment : 烦恼:在每个片段中更改数据后,立即保存:
For EditTexts, use TextWatcher : (example) to save the text when it changes in afterTextChanged() . 对于EditTexts,请使用TextWatcher :( 示例)afterTextChanged()中更改文本时将其保存。
For RadioButtons, use radioButton.setOnClickListener(/**Save data in onClick*/), or radioGroup.setOnCheckedChangeListener if you're using a RadioGroup (example) . 对于RadioButtons,请使用radioButton.setOnClickListener(/ **将数据保存在onClick * /)中;如果使用的是RadioGroup,请使用radioGroup.setOnCheckedChangeListener (示例)
Might not be the most efficient solution, but works :) . 可能不是最有效的解决方案,但可以::。

Use OnPageChangeListener for: all scrolls; 使用OnPageChangeListener用于:所有滚动; page centered; 页面居中; page scroll changes (start drag, finish center animation) 页面滚动更改(开始拖动,完成居中动画)

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
}});

Hmm. Well unless you are doing some sort of save checkmarks along the wizard flow that you want to represent that all data for that page was saved, I would not go that route personally. 好吧,除非您在向导流程中进行某种形式的保存选中标记,以表示该页面的所有数据均已保存,否则我不会亲自走这条路线。 You can easily just recognize pageChanged listener 您可以轻松识别出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
        }
    });

but I would prefer to see onPause() of the parent activity handle saving the data personally. 但我更希望看到父活动的onPause()处理个人保存数据。 But it really depends on your need for the app. 但这确实取决于您对应用程序的需求。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM