2017-03-08 7 views
1

ユーザーがフラグメントに入力したデータをファイルに保存しようとしています。ViewPagerページの変更時のデータ保存

シナリオ: 1 viewpager及び7つの断片

ユーザは、フラグメント0で開始し、スワイプtabhostを使用するか、またはユーザが他のフラグメントに切り替えることができ、フローティング矢印を押すことによってedittexts、 にテキストを入力することができます。

ユーザーが上記の方法で残す断片の入力済みのテキストを保存します。

私はOnPageChangeListenerを試しましたが、前のタブは表示されません。私は実装方法の値を記録したonPageScrolled, onPageSelected, onPageScrollStateChanged

これらのどれも私のニーズにはうまくいかないようです。

onPageScrolledを数回呼ばれ、それが画面になるまでオフセットが異なる場合、現在のタブのみを表示していないが、常に0.0ことから始まり、私は確実にこれを使用することはできませんされています。

onPageSelectedは唯一の信頼できるものですが、唯一の新しい現在のタブを返し

onPageScrollStateChangedは私もViewPageronInterceptTouchEventに見えたが、これはまた、いくつかの時間である私は、タブに

を決定するために使用できる情報がありません何回か(MOVEイベントのために)呼び出され、すべてのタブで常に機能するとは限りません。

この費用を効率的に使用する方法はありますか?私は暗号化されたファイルにデータを保存したいので、これを何度もやりたくはありません。

+0

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(); } } } ... }); 
使用viewPager.setOffscreenPageLimit(6)。 –

+0

全体の質問をお読みください現在のフラグメントが変更されたときに情報を暗号化されたファイルに保存したいので、変更する必要はありません。 – Ben

+0

あなたが 'fragment.onPause()'でそれをやろうとしましたが、それが見えなくなる前に呼び出されましたか? – k3b

答えて

0

私の場合は提案がうまくいかなかったので、他の人と分かち合うことはできませんでした。

まず、私のニーズに合わせてViewPagerに焦点を当てるのではなく、フラグメントが変更されたかどうかを知ってその代わりにそれを処理するのは賢明ではないと思いました。

だから、私は(ページャ内のすべての断片を反復処理)OnPageChangeListener呼び出しonPageSelectedたびにチェックブール属性dataChangedとアンドロイドのフラグメントを拡張する抽象クラスを作成しました。

もちろん、ページャ内のすべてのフラグメントは、抽象クラスを拡張する必要があります。さらに抽象メソッドsave()load()を抽象クラスに追加しました。

onPageSelected(int position)では、一度に1つのみであるすべてのフラグメントのすべての変更を保存した後、今選択したフラグメントのデータをposition属性でロードします。

問題が1つありました。フラグメントが一時停止され再開された場合、onTextChangeListenersにdataChanged属性を設定した場合、dataChanged属性はtrueになりました。なぜなら、アンドロイドが自動的にウィジェットの値を読み込むからです。だからまたoverrideonResumedataChangedfalseに設定する。

また、すべてのMyFragmentは、save()およびload()メソッドのdataChanged属性を処理する必要があります。 ViewPagerの

抽象フラグメント

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

OnPageChangeListener

関連する問題