![](/img/trans.png)
[英]Update fragment view after onCreateView in FragmentPagerAdapter
[英]Update Fragment View within FragmentPagerAdapter in SherlockFragmentActivity
我正在按照ActionBarSherlock的Samples下的示例FragmentTabsPager 。
在我的例子中,我使用TabsPager創建了一個簡單的SherlockActivity,並為FragmentPagerAdapter的示例創建了相同的代碼。
我創建了兩個片段(不同的類)。 第一個只包含四個按鈕。 根據單擊哪一個,主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);
}
我設法使用新值更新Bundle info.args,但我不知道如何正確地將它傳遞給片段並命令它更新其動態View。
這可能嗎?
提前致謝。
UPDATE
最后,我使用了Sunny所解釋的內容。 我保留了一個SparseArray和我的Fragments,所以我可以訪問它們,因為我知道它在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中,我可以訪問我的Layout組件(例如GridView),因為它們是在onCreateView期間初始化的,所以我將所需的所有代碼放在我的updateView()方法中。
例如,我更新了GridView的內容:
[MySecondFragment.java]
myGridView.setBackground(getResources().getDrawable(iCode));
HTH
更新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
FragmentPagerAdapter的源顯示Fragments被賦予以下標記:
"android:switcher:" + viewId + ":" + id;
其中viewId
是ViewPager的ViewPager
, id
是頁碼。
因此,您可以使用以下方法檢索第二頁的片段:
activity.getSupportFragmentManager().findFragmentByTag(
"android:switcher:" + pager.getId() + ":2")
pager
是您的ViewPager
。 然后,您需要將返回的Fragment強制轉換為您擁有的任何特定類,然后調用方法傳遞您需要的信息。
anhanniballake的答案可能有用。 但這可能在將來破裂。
要實際獲取片段,您可以在TabAdapter類中定義sparesArray
private SparseArray<Fragment> map;
並在此數組中添加您的片段
@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類中定義一個可以獲取Fragments的公共方法
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
必須聲明為public :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.