2014-11-13 55 views
0

我在我的應用程序中使用標籤導航。每個選項卡都有一個表格,用於執行類似的任務,所以我使用相同的片段,但只是隱藏/顯示了一些片段。看起來,ViewPager正在實例化3個不同的片段副本,然後在用戶更改標籤時切換它們。由於所有的片段都是相同的,我想通過他們之間的領域的狀態。通過這種方式,當用戶切換到不同的選項卡時,他們在前一選項卡上填寫的信息將出現在新選項卡上。使用標籤導航時,如何在片段之間傳遞數據?

是否有這種方式傳遞數據的首選方法?

的簡單化代碼看起來像這樣...

public class MainActivity extends Activity implements ActionBar.TabListener { 

    SectionsPagerAdapter mSectionsPagerAdapter; 
    ViewPager mViewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager(), this); 

     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      actionBar.addTab(
       actionBar.newTab() 
        .setText(mSectionsPagerAdapter.getPageTitle(i)) 
        .setTabListener(this)); 
     } 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     private Context context; 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     public SectionsPagerAdapter(FragmentManager fm, Context context) { 
      super(fm); 
      this.context = context; 
     } 

     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 3; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      Locale l = Locale.getDefault(); 
      switch (position) { 
       case 0: 
        return getResources().getString(R.string.tab_one_title); 
       case 1: 
        return getResources().getString(R.string.tab_two_title); 
       case 2: 
        return getResources().getString(R.string.tab_three_title); 
      } 
      return null; 
     } 
    } 

    public class MainFragment extends Fragment { 

     private static final String ARG_SECTION_TYPE = "section type"; 

     public MainFragment(){} 

     public MainFragment(int sectionNumber) { 
      Bundle args = new Bundle(); 
      args.putInt(ARG_SECTION_TYPE, sectionNumber); 
      setArguments(args); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

      //setup the view 
      switch(getArguments().getInt(ARG_SECTION_TYPE)) { 
       //hide or show fields based on page number. 
      } 

      return rootView; 
     } 
    } 
} 

如果用戶修改在page 1一個領域,我想這些信息也顯示在page 2page 3。什麼是完成這個的首選方法?

回答

0
  1. 數據推送方法:LocalBroadcastManager

每個片段寄存器一個BroadcastReceiver,並且當數據的改變它廣播到所有註冊的接收器。它是數據的發送者決定何時更新接收對象。

用於實現LocalBroadcastManager的示例:how to use LocalBroadcastManager?

  • 數據拉方法:中央儲存庫。
  • 將數據發送到中間對象(中央存儲庫)以存儲數據。然後,每當需要使用最新數據更新對象時,每個片段都可以輪詢該對象。 ((MyInterface)getActivity).mDataObject.data ...