我使用的是ViewPager有4頁,和我在尋找一種有效的方式來代替片段之間/開關每一頁。在ViewPager替換片段使用FragmentPagerAdapter
這是我試圖創建交互模式:
- 用戶按下目前持有碎片A
- 片段A被換出一些新的B片段在頁面上的一個按鈕
- 用戶確實在B片段一些工作,並隨後按下時,他/她完成
- 片段B被移除的按鈕,並且由片段A(原片段)
我發現了一種方法來做到這一點,但它似乎有重大缺陷。該解決方案涉及除去原片段,然後重寫getItemPosition
(基本上是在此描述related question法):
//An array to keep track of the currently visible fragment in each page
private final Fragment[] activeFragments= new Fragment[4];
public void openFragmentB(ViewPager pager, int position) {
startUpdate(pager);
//Remove the original fragment
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(activeFragments[position]);
transaction.commit();
//Create a new tile search fragment to replace the original fragment
activeFragments[position] = FragmentB.newInstance();
pageStates[position] = PageState.STATE_B;
finishUpdate(pager);
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
//If the main fragment is not active, return POSITION_NONE
if(object instanceof FragmentA) {
FragmentA a = (FragmentA) object;
if(pageStates[a.getPosition()] != PageState.STATE_A) {
return POSITION_NONE;
}
}
//If the secondary fragment is not active, return POSITION_NONE
if(object instanceof FragmentB) {
FragmentB b = (FragmentB) object;
if(pageStates[b.getPosition()] != PageState.STATE_B) {
return POSITION_NONE;
}
}
return POSITION_UNCHANGED;
}
這種方法有效,但具有不期望的副作用。刪除片段並將其置於POSITION_NONE位置會導致片段被破壞。所以當用戶完成使用FragmentB時,我需要創建一個FragmentA的新實例,而不是重用原始片段。尋呼機中的主要片段(本例中爲FragmentA)將包含相對較大的數據庫支持列表,因此我希望儘可能避免重新創建它們。
基本上我只是想繼續引用我的4個主要碎片和交換他們進出的網頁,而無需每次都重新創建它們。有任何想法嗎?
'Fragments'也'Views',你可以用'Fragments'你需要換,就用'setVisibility()'來刪除和添加他們創造一個佈局。 – adneal 2012-04-04 06:29:05