2012-09-07 54 views
0

對於我最新的Android應用程序(API級別15),我使用了新的體系結構,其中GUI中的每個Tab都由在PagerAdapter中註冊的Fragment類表示並且Tab事件得到處理通過TabListener。Android活動與標籤頁:標籤爲空

但是,當我想在兩個選項卡之間發送數據時遇到問題。我使用的代碼樣品從this page和寫了下面的代碼來從標籤數據發送到我的活動:

@Override 
public void onDataReceived(Map<String, List<Map<Integer, String>>> receivedData) { 

    Log.i("CarerActivity:onDataReceived", "Map received by Fragment."); 
    Log.i("CarerActivity:onDataReceived", receivedData.toString()); 
    Log.i("Fragment ID", ""+R.id.configurationfragment); 

    TabConfiguration configurationFragment = (TabConfiguration) getSupportFragmentManager().findFragmentById(R.id.configurationfragment); 

    if(configurationFragment != null){ 
     Log.i("CarerActivity:onDataReceived", "Fragment not null."); 
    }else{ 
     Log.i("CarerActivity:onDataReceived", "Fragment null!"); 
    } 
} 

的receivedData.toString()被正確地顯示,所以標籤將其數據發送到活性的影響。還顯示片段ID。之後,輸出始終爲「CarerActivity:onDataReceived Fragment null!」這使我無法調用片段的任何方法(因爲它是空的)。

在我R.java行

public static final int configurationfragment=0x7f080001; 

可以

public static final class id{ 

下找到。

任何人都知道我在做什麼錯誤或在哪裏尋找錯誤?

設置:Samsung Galaxy Nexus與Android 4.0.3,API級別15,Java 1.6,Mac OS 10.8,Eclipse Juno。

回答

1

這裏有一個有趣的文章關於FragmentPagerAdapter

FragmentPagerAdapter將分離你通過 刷卡列表中的每個片段,但保留在內存中,使他們能夠簡單地重新連接 當用戶刷卡回來。如果你有更多的碎片, FragmentStatePagerAdapter是值得考慮的,因爲它會刪除 他們,缺點是他們需要重建,因爲用戶 滑回他們。因此,如果您有更少,更復雜的碎片,則FragmentPagerAdapter可用,但對於更大的集合,請考慮使用 FragmentStatePagerAdapter。

基本上,當您從一個片段滑動到另一個片段時,前一個片段被銷燬(= null)。

解決此問題的一種方法是將新數據保存在第三方類或您的活動中。然後,在重新創建片段時,將其與新數據捆綁在一起。

這裏是個例:

public class PagerUserAdapter extends FragmentStatePagerAdapter 
{ 
    private final static String titles[] = {"Profile", "Badges", "Skills", "Accomplishments"}; 

    private Bundle args; 

    public PagerUserAdapter(FragmentManager fm, CWUser u) 
    { 
     super(fm); 

     this.args = new Bundle(); 
     args.putSerializable(Constants.BUNDLE_USER, u); 
    } 

    public void refresh(CWUser u) 
    { 
     args.putSerializable(Constants.BUNDLE_USER, u); 
     this.notifyDataSetChanged(); 
    } 

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

    @Override 
    public Fragment getItem(int position) 
    { 
     switch(position) 
     { 
     case 0: 
      return ProfileFragment.newInstance(args); 
     case 1: 
      return BadgesFragment.newInstance(args); 
     case 2: 
      return SkillsFragment.newInstance(args); 
     case 3: 
      return AccomplishmentsFragment.newInstance(args); 
     default: 
      return ProfileFragment.newInstance(args); 
     } 
    } 

    @Override 
    public int getCount() 
    { 
     return titles.length; 
    } 

    @Override 
    public int getItemPosition(Object object) 
    { 
     return POSITION_NONE; 
    } 
} 

public class BadgesFragment extends BaseFragment 
{  
    public static BadgesFragment newInstance(Bundle args) 
    { 
     BadgesFragment f = new BadgesFragment(); 
     f.setArguments(args); 
     return f; 
    } 

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

     CWUser u = (CWUser) getArguments().get(Constants.BUNDLE_USER); 
      //do what you want with your new data 
    } 
} 

在當你得到新的數據你的活動,你所要做的就是打電話給你的適配器的刷新方法與新的數據。 這就是我的做法,它可能有更優雅的解決方案,我願意接受任何建議。 這個例子是基於我的一個開源的應用程序,這裏是project如果你想挖掘完整的代碼。

+0

我明白了......那麼你會建議哪種方法呢?我讀了一些關於碎片交易的內容。還是有更好的方法來做到這一點? – knucKles