2013-02-20 66 views
16

我有一個Fragment具有TabHost作爲根佈局如下...片段getArguments()返回null

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 

      <FrameLayout 
       android:id="@+id/tab_1" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" /> 

      <!-- More FrameLayouts here - each are placeholders for Fragments -->  

     </FrameLayout> 
    </LinearLayout> 
</TabHost> 

創建/更新每個Fragment的選項卡內容是如下所述的代碼.. 。

private void updateTab(String tabId, int placeholder) { 
    FragmentManager fm = getFragmentManager(); 
    if (fm.findFragmentByTag(tabId) == null) { 
     Bundle arguments = new Bundle(); 
     arguments.putInt("current_day", mCurrentTab); 
     EpgEventListFragment fragment = new EpgEventListFragment(); 
     fragment.setArguments(arguments); 

     fm.beginTransaction() 
       .replace(placeholder, new EpgEventListFragment(), tabId) 
       .commit(); 
    } 
} 

EpgEventListFragmentonCreate(...)方法,然後我試圖讓論據Bundle但我總是null執行以下操作...

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Bundle arguments = getArguments(); 
    if (arguments == null) 
     Toast.makeText(getActivity(), "Arguments is NULL", Toast.LENGTH_LONG).show(); 
    else 
     mCurrentDay = getArguments().getInt("current_day", 0); 

    ... 
} 

我在這裏錯過了什麼?我也嘗試在onAttach(...),但我仍然空。我是新使用Fragments所以我希望有一個簡單的原因,但我沒有拿出任何東西時搜索。

回答

43

我想這與你的問題做:

fm.beginTransaction() 
    .replace(placeholder, new EpgEventListFragment(), tabId) 
    .commit(); 

你正在做一個新的Fragment(不帶參數,因爲它已經新鮮實例化)。

而是嘗試

Fragment fragment = new EpgEventListFragment(); 
fragment.setArguments(arguments); 
fm.beginTransaction() 
    .replace(placeholder, fragment, tabId) 
    .commit(); 
+10

哦,你一定是在開玩笑吧... aaaargh! – Squonk 2013-02-20 01:36:37

+2

有時候只需要另一雙眼睛。謝謝!我最初並沒有傳入參數,所以我在調用'replace(...)'的時候創建了'Fragment'。我有一段時間來接受你的答案,但我會這樣做。再次感謝。 – Squonk 2013-02-20 01:41:09

+1

@Squonk不客氣!我記得有一次我忘了擴展'FragmentActivity'。這是我一生中最好的半小時試圖弄清楚:-) – 2013-02-20 01:45:49

相關問題