2016-04-12 17 views
0

私はアプリケーションのデータの関連性に問題を抱えていました。実際のデータをアプリケーションに保存する最良の方法

私たちのアプリでは、1つのアクティビティと多くの断片があります。

たとえば、私たちは1つのFragmentにUserのリストとlikeボタンを持っています(3つの状態:none/like/favorite)。 次のページでは、ユーザーボタンと同様のボタンについても詳しく説明しています。 userListのボタンのように押すと、問題はなく、詳細画面では正しい状態が表示されます。しかし、ユーザーの詳細でボタンのようにクリックしてリストに戻っても、ここに過去のデータが残っています。

フラグメントのためにactivityForResultを使用することはできません。

私たちはrxを使用していますが、この問題を簡単に解決できる方法はありますか?

enter image description here

+0

imoはコンテンツプロバイダー – Pooya

+0

のeventbus apiを使用することができます。いくつかのイベントをアクティビティに投稿して、どのメソッドをトリガーしてもかまいません。または、http://developer.android.com/intl/es/training/basics/fragments/communicating.htmlをご覧ください。 –

答えて

1

Fragment UIコンポーネントを再利用するためには、独自のレイアウトおよび動作を定義完全に自己完結型のモジュール式コンポーネントとしてそれぞれを構築すべきです。それぞれFragmentActivityにデータを通信でき、ActivityFragmentにデータを送信することもできます。

あなたの場合、Activityは実際のデータを保持できます。ユーザーが詳細Fragmentで何かを変更した場合、FragmentはそれをActivityに近づけます。 Activityは、順番にリストFragmentに通知する必要があります。

0

実際には、フラグメントでonActivityResult()アプローチを使用できます。私はこのパターンをさまざまなプロジェクトで数回見てきました。それは、それがあなたに合っているかどうかを決定するまでです。

左側のフラグメントがAFragmentで、右側のフラグメントがBFragmentであるとすると、ここにその考えがあります。

(1)AFragmentにおいて、前Bからトランザクションをコミットする標的断片を設定:

Fragment bFragment = new BFragment(); 
bFragment.setTargetFragment(this, 42); // `this` is your AFragment instance 
// transact here 

(2)onActivityResult()を提供する:

BFragmentで
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // your logic here 
} 

(3)、 onDetach()にデータを準備し、onActivityResult()をターゲットに呼び出します。

@Override 
public void onDetach() { 
    super.onDetach(); 

    if (getTargetFragment() != null) { 
     Intent data = new Intent(); 
     // pass your data here 

     getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, data); 
    } 
} 

この方法では、いつでもBFragmentポップバック、あなたのAFragmentは、そのデータを処理する機会を持っています。

0

私のアプリでこの状況を処理する方法は、SharedPreferencesの中央 "リポジトリ"を使用して複数の画面にシリアル化されたデータを保存することです。新しいアクティビティ(またはあなたのケースではフラグメント)が作成または再開されるたびに、シリアライズされたデータレポに到達してその共有データが設定されます。

これはあなたのケースではこれがうまくいくと思います。あなたの "ユーザー"の例を使用するには、ユーザーデータオブジェクトのリストを保存するSharedPreferencesファイルを作成します。だから私は、ユーザーについて知る必要があるすべてのもの、つまり情報、「好き」の状態などを保存するクラスを用意します。私はどこかのリストにユーザーを持っていると仮定すると

は、私はちょうどGsonでそれをシリアル化し、私が作成したSharedPreferencesにシリアライズされたデータを保存します。次に、各フラグメントは、シリアル化されたデータをポーリングするだけで、ユーザーの現在の状態を取得できます。いくつかの変更が行われた場合、各Fragmentはデータを同じSharedPreferencesファイルに保存して、他のFragmentがそれを使用してビューをインスタンス化できるようにします。

ここにいくつかの擬似コードは

...次に、あなたがどこかのユーザーのリストを持っていると仮定すると、私はそのリストをシリアル化し、このようなファイルグローバルSharedPreferencesに保存します...

//Some kind of data class for User 
class MyUser { 
    String name; 
    String location; 
    String likeStatus; 
    //... whatever else 
} 

ですその後

//ArrayList<MyUser> users <- defined somewhere 
Gson gson = new Gson(); 
String usersJson = gson.toJson(users); 
SharedPreferences userPrefs = getSharedPreferences("users_storage", MODE_PRIVATE); 
SharedPreferences.Editor editor = userPrefs.edit(); 
editor.putString("users_data_key", usersJson); 
editor.apply(); 

新しいフラグメントがロードされ、それがユーザーの現在の状態を知る必要がありますされ、それは単に

012 ... SharedPreferencesファイルを開き、このようなすべての現在の状態を取得します

このアプローチはすべてあなたのアクティビティで実行され、新しいフラグメントを開始するときは、正しくインスタンス化する必要があるデータを渡すだけです。次に、フラグメントがデータを保存する必要がある場合、単にアクティビティのメソッドを呼び出し、保存する必要のあるデータを渡すだけで、アクティビティは上のコードを実行して保存します。

関連する問題