0

私は現在、他のモジュールにも適用したい私のアプリケーション&設定デザインのモジュール1に取り組んでいます。データの受け渡しを管理する方法は?

Iは、モジュール内の要素の下に持っている1

  1. MainActivity - > 3つの断片[A、B、C]
  2. すべての3つの断片を含む - > ViewPager
  3. 各ViewPagerを有する - > 5つのフラグメント[すべてのViewPagerフラグメントは、入力フォームの一種です。& ViewPagerのフラグメント1から2から3までのデータを共有します。フラグメント5では、データを保存するSAVEボタンが有効になります。 (フラグメント1-5はp-tを意味すると仮定する)
  4. もう1つの部分はフラグメント1であるか、またはAは5つのサブフラグメントをロードするViewPagerのコードを持つコンテナのようなものです& &のシーケンシャルフラグメントからデータを取得します。これはそれをこれを行うための正しい方法はありますしたいか、私はこのデザインパターンを変更する必要があり、非常に&思わ

    私の質問がある

、?そして、この設計アプローチが正しい場合、データの受け渡しをどのように管理すればよいですか?

+0

3つの主要なフラグメントの違いは何ですか?彼らはちょうど異なるオブジェクトを更新していますか?最終更新データはどこに表示されますか?またはそれを保存して入力フォームを表示し続けますか?また、項目5はあまり明確ではない。フラグメントAには、1-4で説明したシナリオとは異なる特殊なケースがありますか? –

+0

QでQに答えます。3フラグメントは3つの異なるサブフローです。すべては独立していますが、以前のフラグメントから保存されたSQLIteを使用してデータを取得できます。ちょうどデータを収集し、APIとSQLiteに送信する。フラグメントには、次の画面に移動するSWIPE機能のみを持つSAVEボタンおよび1-4と一緒に入力フィールドがほとんどありません。 – VVB

答えて

0

あなたはこれを行う方法が異なることを覚えておいてください。正しい方法はありません。 私はあなただったので、私はドメインオブジェクトを分離しようとし、データのためのモデルとビューだけを扱うビューを持っています。 私にとって最高ののは、MVVMパターンに従うことです。このMVVMパターンは、多くの制御を提供し、Googleのアンドロイドデータバインディングライブラリのドキュメントで読むことができます。

もう1つの方法は、すべてのビューがアクセスできるすべてのデータとビジネスロジックを持つSingleton WorkFlowManagerをハッキングすることです。 このようにして、Any Fragment/Activityは、すべてのフォームフィールドが設定されているかどうかをチェックし、Saveボタンを表示させることができます。 イベントでビューを更新する場合は、ManagerでカスタムのeventListenersを作成し、最後のフィールドがいっぱいになるとすぐにFormFilledEvent(または類似のもの)をトリガーし、そのイベントをリスニングするFragmentレジスタに登録してButttonが見える。

これは、1つのユースケースですが、複数の

ハッピーコーディングを持つことができます;)

+0

@ A.Aに追加されたコメントをお読みください。 – VVB

0

これはそれをか 私はこれを変更する必要があり、これを行うための正しい方法はありますしたい非常&ですデザインパターン

少し複雑すぎるようです。私はむしろ、ViewPagerの5つのフラグメントすべてを、メインフラグメントから各サブフラグメントにデータを渡すのを避けるために、保存FAB /ボタンを持つ1つのフォームとして保持したいと思います。ただし、記述する場合には非常に長い形式になり、前のフィールドにフィールドが依存するかどうかが多すぎることがあります。

この設計アプローチが正しい場合は、データをどのように管理する必要がありますか ?各メインFragmentについて

、Iは主フラグメントのデータベースからロードされる全体のサブフローのためParcelableを実装する一つのオブジェクトを使用し、対応するフィールドを埋める時にサブフラグメントに1を渡します。最後のサブフラグメントは、データベースへの更新されたオブジェクトを保存するための責任がある、または単に保存するための主なフラグメントに戻ってそれを渡す

更新:

私はこのコードをテストしたが、ここではしていません私は、サブフラグメントにメインの断片からデータを渡すだろうか一つの方法は次のとおりです。

MainFragment.java

public class MainFragment extends Fragment 
{  
    private MyObj myObj; 
    private SubFragment currentFragment; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) 
    { 
     final View view = inflater.inflate(R.layout.fragment, parent, false); 
     final ViewPager pager = (ViewPager) view.findViewById(R.id.pager); 

     myObj = db.loadObject(); 
     pager.setAdapter(new MyPagerAdapter(getChildFragmentManager())); 

     return view; 
    } 

    public static class MyPagerAdapter extends FragmentPagerAdapter 
    { 

     MyPagerAdapter(FragmentManager manager) 
     { 
      super(manager); 
     } 

     @Override 
     public Fragment getItem(int position) 
     { 
      if(currentFragment != null) myObj = currentFragment.getMyObj(); 
      switch(position) 
      { 
       case 4: 
        currentFragment = FragmentT.getInstance(myObj); 
        break; 
       case 3: 
        currentFragment = FragmentS.getInstance(myObj); 
        break; 
       case 2: 
        currentFragment = FragmentR.getInstance(myObj); 
        break; 
       case 1: 
        currentFragment = FragmentQ.getInstance(myObj); 
        break; 
       case 0: 
       default: 
        currentFragment = FragmentP.getInstance(myObj); 
      } 
      return currentFragmnet; 
     } 

     @Override 
     public int getCount() 
     { 
      return 5; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) 
     { 
      return titles[position]; 
     } 
    } 
} 

SubFragment.java

public class SubFragment extends Fragment 
{ 
    protected static final String ARGS = "args"; 

    protected MyObj myObj; 

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

     final Bundle args = getArguments(); 
     if (args != null) 
     { 
      myObj = args.getParcelable(ARGS); 
     } 
    } 

    public MyObj getMyObj() 
    { 
     return myObj; 
    } 
} 

FragmentP.java

public class FragmentP extends SubFragment 
{   
    public static FragmentP getInstance(MyObj myObj) 
    { 
     final FragmentP fragment = new FragmentP(); 
     final Bundle args = new Bundle(); 
     args.putParcelable(ARGS, myObj); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    ... 
} 
+0

SWIPEでデータをフラグメント1から別のものに渡す方法はありませんが、つまり、サブフラグメント内でページ変更リスナーをどのように管理するのかということです。 – VVB

+0

@VVB私はサブフラグメントにデータを渡す方法のいくつかのコードで私の答えを更新しました –

0

これは、オブザーバの設計パターンを用いて解くことができます。あなたのモデルを観測可能にし、観察者として更新するすべてのコンポーネントを登録します。私はこれを解決するためにRXjavaをお勧めします。

関連する問題