我按照示例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
當我改變東方設備既不destroyItem也不getItem被調用,所以當重新創建Activity時,Fragment SparseArray不會再被重新填充。我也試過用FragmentStatePagerAdapter沒有運氣。我能做什麼? – aloplop85
當您的設備旋轉時,您的'MainSherlockActvity's'onCreate'方法被調用,在'onCreate'方法中,您的tabAdapter會再次初始化。所以你的sparesArray不應該是null。你應該使用'FragmentStatePagerAdapter'。 – Sunny
tabAdapter正確初始化並且SparseArray不爲空。但是,由於getItem不會再次被調用,碎片不包含在該數組中(即SparseArray大小爲0)。 – aloplop85