0

我目前正在爲我的應用&的模塊1進行設置,我也想爲其他模塊申請設計。如何管理數據傳遞?

我具有低於在模塊元件1

  1. MainActivity - > 3個片段[A,B,C]
  2. 所有3個片段包含 - > ViewPager
  3. 每個ViewPager具有 - > 5個片段[ p,q,r,s,t]
  4. 所有的ViewPager片段都是一種輸入形式&想要將ViewPager的片段1到2中的數據共享到2到3到5.在片段5上,SAVE按鈕啓用保存數據。 (假設片段1-5表示p-t)
  5. 另一部分是片段1或A就像容器,它具有ViewPager代碼來加載5個子片段&從連續片段獲得數據&進一步傳遞。

我的問題是,

這似乎非常&想是不是正確的方式做到這一點,或者我應該改變這種設計模式?而且,如果這種設計方法是正確的,那麼我應該如何管理數據傳遞?

+0

3個主要碎片有什麼不同?他們只是更新不同的對象?你在哪裏顯示最終更新的數據?還是隻是將其存儲並繼續顯示輸入表單?另外,第5項不太清楚。片段A是否有與1-4中描述的場景不同的特殊情況? –

+0

Q將回答Q. 3片段是3個不同的子流。所有都是獨立的,但可以使用從前面的片段保存的SQLIte來獲取數據。只需收集數據併發送到API和SQLite。片段只有很少的輸入字段,SAVE按鈕和1-4只有SWIPE功能才能移動下一個屏幕。 – VVB

回答

0

請記住,你將有不同的方式來做到這一點,沒有一個是正確的只是更容易或更乾淨。 所以,如果我是你,我會嘗試分離域對象,並有一個模型的數據和視圖只處理視圖部分。 對我來說,最好的做法是遵循MVVM模式,它可以提供很多控制,並且可以在Google android數據綁定庫文檔中閱讀它。

另一種方式是盜用它,可以說有一個Singleton WorkFlowManager,所有視圖都可以訪問,並且擁有所有數據和業務邏輯。 這樣Any Fragment/Activity可以檢查是否所有的表單字段都已設置,並使保存按鈕可見(例如)。 如果你想用事件更新視圖,你可以在Manager上創建自定義事件監聽器,並且一旦最後一個字段被填充,觸發一個FormFilledEvent(或者類似的)並且讓Fragment註冊該事件來監聽它, Buttton可見。

這是一個用例,但你可以有多個

快樂編碼;)

+0

請閱讀我的評論添加到@ A.A。 – VVB

0

這似乎非常&想這是不是正確的方式做到這一點或 我應該改變這種設計圖案

這對我來說似乎有點太複雜。我寧願將ViewPager的所有5個片段保存爲一個帶有保存FAB /按鈕的表單,以避免將數據從主片段傳遞到每個子片段。但是,如果您描述的情況可能會導致很長的格式,或者如果字段取決於之前的格式,則會導致太多的檢查。

如果這種設計方法是正確的那麼我應該如何管理數據 傳遞?

對於每個主Fragment,我會使用,對於該被從數據庫加載到主片段整個子流實現Parcelable一個對象,然後被傳遞到子片段一次一個填充相應字段中。最後一個子片段將負責更新的對象保存到數據庫中,或者只是把它傳遞迴主片段保存

更新:

我還沒有測試此代碼,但在這裏是單程我將如何從主片段亞片段傳遞數據:

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

這可以通過使用觀測器的設計模式來解決。使您的模型可觀察,並註冊所有的UI組件作爲觀察者進行更新。我會推薦RXjava來解決這個問題。