我按照示例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