2012-01-25 155 views
1

我正在構建一個應用程序,該接口基於此http://code.google.com/p/android-playground/,我需要在每個選項卡(即片段)中都有一個片段。這些標籤都是從同一個xml中膨脹的,並且在那個xml中我有一個片段標籤。在不同標籤中的android片段

問題是,當創建活動時,由於選項卡中每個片段的ID都相同,因此應該轉到第二個選項卡的內容先放在第一個選項卡中。

我使用此代碼替換片段的標籤

FragmentTransaction ft = x.getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.details, fragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
ft.commit(); 

我不知道是否有可能糾正。

回答

1

你想要所有的標籤有完全相同的內容?

通常,當在標籤中放置片段時,每個標籤會顯示不同的內容,因此每個標籤的xml文件並不少見。您可以爲每個標籤分別設置一個xml佈局,每次只用一個不同的標識聲明片段。沒有爲每個片段聲明一個獨立的(唯一的)id,我不知道如何獲得特定片段的句柄(因爲id是唯一的句柄)。

根據您的需要,您也許可以使用FragmentPagerAdapter。然後,您可以淡化當前標籤片段,然後撥打public void notifyDataSetChanged()並提供新的片段。這並不是真正做到這一點的標準方式,並且不會保留在後面的堆棧中。

可選,你可以在PagerAdapter編程方式創建的每個選項卡,並設置每個片段的tag調用FragmentTransaction.add(..),然後使用該標籤唯一的標籤在未來片段交易忽略這個時候,它看起來並不像你可以切換fragements帶有標籤,身份證只是害怕。用我的第一個建議去吧!

+0

謝謝你的快速回答。 是的,我需要的片段是平等的。 因爲它們顯示不同的信息,但具有相同的格式。 我會試一試你的建議 –

0

我一直在努力,我後來通過訪問Adapter獲取標籤,我從Activity後面引用Fragment的方式。

假設你使用Adapter,你可以做這樣的事情

private mTabsAdapter; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // etc 

    this.mTabsAdapter = new TabsAdapter(this, this.mViewPager); 

    // Tab1 
    Tab tab = actionBar.newTab(); 
    this.mTabsAdapter.addTab(tab, MyFragment1.class, null); 

    // Tab2 
    tab = actionBar.newTab(); 
    this.mTabsAdapter.addTab(tab, MyFragment2.class, null); 
} 

public MyFragment1 getTab1() { 
    return (MyFragment1)this.mTabsAdapter.getItem(0); 
} 

public MyFragment2 getTab2() { 
    return (MyFragment2)this.mTabsAdapter.getItem(1); 
} 

那麼你的片段裏面,你就必須訪問

public class MyFragment1 { 
    // ... 

    public void reloadData() { 
     // reload data here 
    } 
} 

的方法現在,您可以訪問Fragment

this.getTab1.reloadData(); 

這感覺就像一個sad訪問片段的方式,但不能依賴每個場景中的標籤。另外,您必須注意僅在對Fragment的引用存在的地方引用此處。

可能有時間,這將是null。舉個例子,如果你有一堆標籤,他們可能會在某個時候收集垃圾。您應該通過回調在Fragment之間進行通信。此示例僅適用於少數情況。

回調方法描述在Communicating with the Activity,我會建議這種方法,如果它適合您的應用程序。這將防止在大多數情況下直接訪問標籤。