ViewPager页面更改时保存数据

时间:2017-03-08 11:42:10

标签: android android-viewpager

我正在尝试将用户在片段中输入的数据保存到文件中。

方案: 一个viewpager和7个片段

用户从片段0开始,可以将文本输入edittexts, 通过滑动,使用tabhost或按浮动箭头,用户可以切换到其他片段。

我想用上述方法保存用户离开的片段的输入文本。

我尝试了 OnPageChangeListener ,但我无法获得上一个标签。我记录了实现方法 onPageScrolled, onPageSelected, onPageScrollStateChanged 的值。

这些似乎不适合我的需要。

onPageScrolled被多次调用,只显示当前标签,直到它是屏幕,偏移量不同,并不总是以 0.0 开头,所以我无法可靠地使用它

onPageSelected是唯一可靠的,但只返回新的当前标签

onPageScrollStateChanged没有可用于确定标签的信息

我也查看了onInterceptTouchEvent中的ViewPager,但有时也会多次调用(对于MOVE事件)并且并不总是适用于每个标签。

有没有办法让这个成本高效?我想将数据存储在加密文件中,并且不想多次这样做。

1 个答案:

答案 0 :(得分:0)

因为这些建议对我的案例不起作用,所以我提出了另一个我想与他人分享的想法。

首先,我没有把注意力集中在ViewPager上以满足我的需求,我认为如果知道它是否已经改变并且处理它而不知道它是否是聪明的。

所以我创建了一个使用布尔属性dataChanged扩展android Fragment的抽象类,我每次OnPageChangeListener调用onPageSelected时都会检查它(遍历寻呼机中的所有片段)。

当然,寻呼机中的所有片段都应该扩展抽象类。此外,我向抽象类添加了抽象方法save()load()

所以在onPageSelected(int position)中,在保存所有片段的所有更改(一次只能是一个片段)之后,我会通过position属性加载当前所选片段的数据。

只有一个问题。如果片段被暂停并恢复,那么如果我在onTextChangeListeners中设置它,则dataChanged属性始终为true,因为android会自动加载小部件值。我也override onResumedataChanged设置为false

每个MyFragment也必须处理save()load()方法中的dataChanged属性。

摘要片段

public abstract class MyFragment extends Fragment {

    private boolean dataChanged = false;

    @Override
    public void onResume() {
        super.onResume();
        setDataChanged(false);
    }

    public boolean isDataChanged() {
        return dataChanged;
    }

    public void setDataChanged(boolean dataChanged) {
        this.dataChanged = dataChanged;
    }

    public abstract void save();

    public abstract void load();
}

ViewPager的OnPageChangeListener

fragmentViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            ...
            @Override
            public void onPageSelected(int position) {
                for(Fragment f : fragments) {
                    if(f instanceof MyFragment && ((MyFragment)f).isDataChanged()) {
                        ((MyFragment) f).save();
                    }
                }

                if(fragmentViewPager.getCurrentItem() == position) {
                    Fragment fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.view_pager + ":" + fragmentViewPager.getCurrentItem());
                    if(fragment instanceof MyFragment) {
                        ((MyFragment) fragment).load();
                    }
                }
            }
            ...
});