2017-03-08 53 views
1

我試圖保存用戶輸入到文件片段中的數據。當ViewPager頁面變化時保存數據

場景: 一個viewpager和7個片段

用戶啓動在片段0,並且可以通過滑動,使用tabhost或按壓浮動箭頭用戶可以切換到其它片段文本輸入到edittexts, 。

我想用上面的方法保存用戶離開片段的輸入文本。

我試過OnPageChangeListener,但在那裏我不能得到以前的選項卡。我記錄了實施方法的值onPageScrolled, onPageSelected, onPageScrollStateChanged

非這些似乎符合我的需求。

onPageScrolled被調用多次,僅顯示當前標籤,直到它是屏幕的,偏移量是不同的,並且不總是由0.0開始,所以我不能可靠地使用此。

onPageSelected是唯一可靠的人,但只返回當前新標籤

onPageScrollStateChanged沒有信息,我可以用它來確定選項卡

我也看了成onInterceptTouchEventViewPager但這也是一些時間多次調用(對於MOVE事件),並不總是適用於每個選項卡。

有沒有辦法讓這個成本高效?我想將數據存儲在一個加密文件中,不想多次執行此操作。

+0

使用viewPager.setOffscreenPageLimit(6); –

+0

請閱讀我想在當前片段更改時將信息存儲在加密文件中的整個問題,因此我不需要更改該信息。 – Ben

+0

你是否試圖在'fragment.onPause()'中調用它,它在它變爲不可見之前被調用? – k3b

回答

0

因爲這些建議並不適合我的情況,所以我提出了另一個想法,我不想與其他人分享。

首先,不是專注於ViewPager來滿足我的需求,我認爲引導片段知道它是否改變並處理它是不明智的。

所以我創建了一個包含布爾屬性dataChanged我檢查每次OnPageChangeListener電話onPageSelected(遍歷尋呼機的所有片段)延伸的Android碎片化的抽象類。

當然,pager中的所有片段都應該擴展抽象類。此外,我將抽象方法save()load()添加到抽象類。

因此,在onPageSelected(int position)中,在保存所有片段的所有更改(應該一次只有一個)後,我通過position屬性加載當前選定片段的數據。

只有一個問題。如果一個片段被暫停並重新開始,那麼dataChanged屬性總是爲true,如果我將它設置在onTextChangeListeners中,這是因爲android會自動加載widget值。所以我也overrideonResume設置dataChangedfalse

此外,每個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(); 
        } 
       } 
      } 
      ... 
});