2013-04-18 34 views
1

我按照示例FragmentTabsPager下的示例ActionBarSherlock更新SherlockFragmentActivity中FragmentPagerAdapter中的片段視圖

在我的情況下,我用TabsPager和FragmentPagerAdapter的示例創建了一個簡單的SherlockActivity。

我創建了兩個片段(不同的類)。第一個包含四個按鈕。取決於點擊哪一個,主Activity獲取代碼(例如1,2,3,4)。我得到正確的按下按鈕的代碼。

現在,在第二個片段中,我想根據代碼繪製一些東西,或者相同的東西,動態更新其視圖。

我已經搜索了一個解決方案,但我沒有得到任何東西。在這種情況下,我有這樣的:

[MainActivity.java]

 public static class TabsAdapter extends FragmentPagerAdapter 
      implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener { 

private final Context mContext; 
     private final TabHost mTabHost; 
     private final ViewPager mViewPager; 
     private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();  
[...] 
    @Override 
     public Fragment getItem(int position) { 
      TabInfo info = mTabs.get(position); 
      return Fragment.instantiate(mContext, info.clss.getName(), info.args); 

    } 

我設法更新包新值info.args,但我不知道如何把它傳遞給片段正確並命令它更新其動態視圖。

這可能嗎?

在此先感謝。

UPDATE

最後,我用什麼陽光好心地解釋。我保持一個SparseArray我的片段,我肯定可以訪問它們,因爲我知道它的位置裏面MainActivity:

[MainActivity.java]

//Once the user presses the button on the first fragment, the callback calls 
// this function 
    public void onImageSelected(int iNumber){ 

    MySecondFragment msf = (MySecondFragment)mTabsAdapter.getFragment(POS_1); 

     if(msf != null){ 

       msf.setNumImage(iNumber);    
       msf.updateView();         
      }     
     } 

最後在MySecondFragment.java我可以訪問我的佈局組件(例如一個GridView),因爲它們在onCreateView期間被初始化,所以我把我需要的所有代碼放入我的updateView()方法中。

例如,我更新一個GridView的內容:

[MySecondFragment.java]

myGridView.setBackground(getResources().getDrawable(iCode)); 

HTH

UPDATE 2

我已經包含以下代碼以便將片段保存到主要活動的狀態包中。當從縱向到橫向或反之亦然(這是重建)功能的getItem應用變化不會被調用,所以SparseArray地圖不再必要的片段補充:

@Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putString(CURRENT_TAB, mTabHost.getCurrentTabTag()); 

     getSupportFragmentManager().putFragment(outState, MyFirstFragment.class.getName(), mTabsAdapter.getFragment(POS_1)); 

     getSupportFragmentManager().putFragment(outState, MySecondFragment.class.getName(), 
       mTabsAdapter.getFragment(POS_2)); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 

     if (savedInstanceState != null) { 

      MyFirstFragment mff = (MyFirstFragment) getSupportFragmentManager().getFragment(savedInstanceState, MyFirstFragment.class.getName());       

      if(mff != null) 
       mTabsAdapter.setFragment(POS_1, mff); 

      MySecondFragment msf = (MySecondFragment) getSupportFragmentManager().getFragment(
        savedInstanceState, MySecondFragment.class.getName());       

      if(msf != null) 
       mTabsAdapter.setFragment(POS_2, msf); 

      mTabHost.setCurrentTabByTag(savedInstanceState 
        .getString(CURRENT_TAB));   
     } 
    } 

而且,內在TabsAdapter類:

public Fragment getFragment(int pos) { 
    return map.get(pos); 
} 

public void setFragment (int position, Fragment fragment) { 
    map.put(position, fragment); 
} 

HTH

回答

1

anhanniballake答案可能有效。但這可能會在未來打破。

要真正讓你可以在你的TabAdapter類

private SparseArray<Fragment> map; 

定義sparesArray的片段,這陣

@Override 
public Fragment getItem(int position) { 
    TabInfo info = mTabs.get(position); 
    Fragment fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args); 
    map.put(position, fragment); 
    return fragment; 
} 

您還需要從圖的時候片段刪除片段添加片段破壞

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    map.remove(position); 
    super.destroyItem(container, position, object); 
} 

現在在TabAdapter類中定義一個公共方法w HICH可以得到碎片

public Fragment getFragment(int pos) { 
    return map.get(pos); 
} 

現在,在你的主SherlockFragementActivity您可以得到任何片段

MyFragment f = (MyFragment) mTabsAdapter.getFragment(1); // 1 means second fragment from left 

實例現在用你上面有

f.doAnyThingInMySecondFragment(); 
片段實例調用您的片段的任何方法

doAnyThingInMySecondFragment必須公開:)

+1

當我改變東方設備既不destroyItem也不getItem被調用,所以當重新創建Activity時,Fragment SparseArray不會再被重新填充。我也試過用FragmentStatePagerAdapter沒有運氣。我能做什麼? – aloplop85

+0

當您的設備旋轉時,您的'MainSherlockActvity's'onCreate'方法被調用,在'onCreate'方法中,您的tabAdapter會再次初始化。所以你的sparesArray不應該是null。你應該使用'FragmentStatePagerAdapter'。 – Sunny

+0

tabAdapter正確初始化並且SparseArray不爲空。但是,由於getItem不會再次被調用,碎片不包含在該數組中(即SparseArray大小爲0)。 – aloplop85

2

source for FragmentPagerAdapter顯示,碎片給出了以下標籤:

"android:switcher:" + viewId + ":" + id; 

哪裏viewId是您ViewPagerid的R.id是頁碼。

因此,您可以通過檢索第二頁的片段:

activity.getSupportFragmentManager().findFragmentByTag(
    "android:switcher:" + pager.getId() + ":2") 

哪裏pager是你ViewPager。然後,您會想要將返回的片段轉換爲您擁有的任何特定的類,然後調用一個方法來傳遞所需的信息。