我有一個主要的TabActivity它有兩個選項卡,A和B(現在)。 Tab A加載一個FragmentActivity(下面給出的代碼),它僅僅包含一個FrameLayout
,所以我可以加載我的碎片爲其中的特定標籤。FragmentManager.popBackStack()不會簡單地加載前一個片段
第一片段具有一些TextViews和一個的ListView。數據是從Web服務中提取的。當我點擊ListView的項目時,我在另一個Fragment(這也來自Web服務)中加載該項目的細節,並用另一個細節片段替換當前的Fragment(帶有ListView和其他控件)。
要做到這一點,我使用Android的支持,v4.jar庫使用片段作爲他們首選。
選項卡中的FragmentActivity的XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/updates_frame"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/background"/>
</LinearLayout>
選項卡中的FragmentActivity Java代碼:
public class UpdatesFragmentActivity extends FragmentActivity implements
IUpdateNotifier {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.updates);
//Load Initial Fragment into FrameLayout
//I am adding this Fragment to BackStack
Fragment newFragment = new UpdatesFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.addToBackStack(null);
ft.add(R.id.updates_frame, newFragment);
ft.commit();
}
//This is an Interface method which I call with the clicked "FEED" object to load its detail in another Fragment
@Override
public void onFeedSelected(Feed feed) {
// Instantiate a new fragment.
Fragment newFragment = new FeedDetailFragment(feed);
// Add the fragment to the activity, pushing this transaction
// on to the back stack.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.updates_frame, newFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
}
//This is another Interface Method which I call when the user presses "BACK".
//I am trying to load the previously loaded Fragment, which I added to BackStack.
//But this causes reconstruction of the previously loaded fragment. LIST in this case
//which call the web service. I DONT WANT TO CALL SERVICE AGAIN.
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
}
}
}
我已經創建了一個接口IUpdateNotifier,其中包含兩個方法:
public void onFeedSelected(Feed feed);
public void onBackPressed();
父UpdatesFragmentActivity實現了這些方法。我從兒童片段中調用這些方法進行下列操作。
- 我請onFeedSelected(進料進料)由具有的ListView的片段。我將單擊的訂閱源項目發送給父FragmentActivity,以便加載另一個包含該訂閱源細節的Fragment。
- 當用戶按下一個按鈕時,我會從第二個供稿細節Fragment調用onBackPressed(),該按鈕應該將包含ListView和其他控件的第一個片段帶回來。正如你所看到的,我打電話FragmentManager的popBackStack()方法帶回第一個片段...
但第一個片段得到更新並加載所有的數據從web服務。
其實我無法和存儲數據只有一次,也不是更新一些的時間間隔頻繁。用戶可以在他想要的時候更新列表。最初,列表從服務中加載前10個項目,然後如果用戶想要加載更多項目,則可以單擊列表末尾的「更多」按鈕。
它會加載下10個項目等等。但我想我可以將檢索到的ArrayList存儲在UpdatesFragmentActivity的某個變量中,然後只是將該ArrayList重新分配給列表的適配器,而不是從服務中加載數據,但我不知道如何使Fragment不再調用服務。
我希望它的行爲像我點擊標籤2然後再點擊標籤1。它只是顯示加載的數據,如同被隱藏並不會調用服務。
我該如何做到這一點?
沒有u得到任何解決方案 – 2014-02-17 06:28:09