2016-04-05 15 views
6

私にはActivityと5 Fragmentがあります。最初のFragmentのユーザー入力電話番号。最後に(5番目)Fragment私はこの電話番号を表示し、他のフィールドを入力して、すべてのデータをサーバーに送信する必要があります。それぞれについてFragment私は別のプレゼンター(MVP)を使用しています。フラグメント間のデータを渡す

最初のフラグメントのデータを最後まで渡す方法はありますか?

1)私は、このデータが必要ないので、すべてのフラグメントチェーンを通過したくありません。

2)このデータをホストActivityに保存する場合、をFragmentクラス内に呼び出してこのデータをPresenterに渡す必要があります。

3)最後の方法を選択しました。私は、Singleton UserDataクラスを作成しました。これは単純なPOJOクラスです。最初のFragmentUserDataのインスタンスを作成し、最後のFragmentでそれを使用してデータを検索し、欠落したフィールドを追加します。

しかし、私はシングルトンの正しい解決策でアプローチがわからない。ユーザーが別のActivityに行くと、シングルトンインスタンスをクリアする必要があるためです。 もっと良い解決策がある場合は?私はEventBusについて考え

EDIT

。しかし、私は断片から発表者にデータを渡さなければなりません。今私はUserData.getInstance()を現在の内部に呼び出し、データを取得します。コードをよりエレガントにして修正したい。私は経験豊かな開発者の意見を聞きたいと思っています。

+0

'SharedPref'を使用できませんか? –

+0

@RohitAryaこれは、アクティビティ内のデータを保持するよりも優れた解決策だとは思わない。私は長い時間ではなく、サーバーに送るためにこのデータだけを必要とします –

+0

次にシングルトンは良いアプローチになります。 –

答えて

2

は、私はそれをModellViewPresenterの道

class CustomerModel { 
    String phoneNumber 
} 

interface ICustomerOwner { 
    CustomerModel getCustomer() 
} 

class CustomerRegistrationWorkflowActivity extends Activity implements ICustomerOwner { 
    CustomerModel getCustomer() 
    ... 
} 

class CustomerContactDataFragment // fragment1 where you edit the phone number. 

class CustomerRegistrationSummaryFragment // fragment5 showing all data plus submit button) 

を行うだろう、私はたくさん持っていた

((ICustomerOwner) getActivity()).getCustomer() 
2

あるクラス(フラグメント)でも別のクラスにデータを送信する方法はたくさんあります。

フラグメントのライフサイクルの問題を考慮する。何か面倒なくイベントバスを使用することができます。

class FragmentA { 
    Bus bus; 

    onCreate(){ 
     bus = new Bus(); 
    } 

    @Subscribe public void receiveMessage(String message) { 
     // TODO: Parse your message 
    } 

    onResume(){ 
     bus.register(this); 
    } 

    onPause(){ 
     bus.unregister(this); 
    } 
} 

class FragmentB { 

    onCreate(){ 
     bus.post("You have a message"); 
    } 
} 

otto hereの統合に関する詳細。 他にもたくさんの選択肢があります。 https://greenrobot.github.io/EventBus/

+0

私はEventBusについて考えました。しかし私は私の質問のコメントに書いた。私は 'Fragment'から発表者にデータを渡さなければなりません。今は 'UserData.getInstance()'を現在の内部で呼び出し、データを取得します。コードをよりエレガントにして修正したい場合は –

+2

何かがあれば修正してください。あなたの質問にそれを加えてください。どのようにあなたの質問とあなたのコメントを準備するためにいくつかの答えを与えることを期待していますか? – amalBit

+0

私はqestionを更新しました –

0

フラグメントは常にそれを含むアクティビティに接続されます。したがって、アクティビティと簡単に通信できます。アクティビティを通信用のチャンネルまたは通信用のメディアとして使用すると、同じアクティビティにアタッチされたフラグメント間に通信リンクを作成できます。

アクティビティに接続されたフラグメントは、getActivity()メソッドによってアクティビティのインスタンスにアクセスでき、このインスタンスでは、フラグメントはアクティビティのメソッドの呼び出しのようなタスクを実行できます。

1つのフラグメントから別のフラグメントにデータを転送するには、アクティビティでメソッドを作成し、そのメソッドを介して変数にデータを保存します。そして、他の断片では、他の方法の助けを借りてその変数の値にアクセスすることができます。 getterメソッドとsetterメソッドの概念をここで使用できます。より多くの活動についての情報とフラグメントの通信のために

、リンクを参照してください - 古き良きコールバックhttp://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

1

一つはイベントバス、その他を使用してエレガントなソリューションを呼び出します。 私の見解は、「断片の連鎖」の状況を避けることです。ある断片が別の断片を直接呼び出すときです。アクティビティがフラグメント置換を完全に処理する場合は、5つのフラグメントすべてに等しいアクセス権があります。 したがって、コールバックを使用してそれらの間で簡単にデータを渡すことができます。

この場合、MVPに問題はありません。 Presenterはコールバックを使用してビュー(フラグメント)にデータを送信します。フラグメントは、そのアクティビティにデータを送信するコールバックを使用します。アクティビティはフラグメントマネージャで5番目のフラグメントを見つけ、5番目のフラグメントのデータを更新/渡します。

コールバックを使用する状況は、イベントバスよりも堅牢に見えますが、依然として趣味の問題です。モデルは(CustomerRegistrationWorkflow)活動に住んでいるので

0

を呼び出すことによって、モデルと を通信することができる断片相互に断片的または断片的にデータを渡すことに関する問題のその結果、私はDataCacheに任意のオブジェクトを渡しました。

これは超簡単な例です。レシーバ

public class FragmentB { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      String msg = DataCache.getInstance().pop(String.class); 
     } 
    } 

ための送信者

public class FragmentA { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     String msg = "the phone number" 
     DataCache.getInstance().push(msg); 
    } 
} 

フラグメントのためのGihub : Android DataCache

フラグメントはそれを試してください:D私はあなたが助けることを願っています。

関連する問題