2013-02-20 38 views
16

Tôi có một Fragment trong đó có một TabHost như cách bố trí gốc như sau ...Fragment getArguments() trả về 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> 

Mã để tạo/cập nhật mỗi Fragment về nội dung tab như sau .. .

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(); 
    } 
} 

trong phương pháp onCreate(...) của EpgEventListFragment sau đó tôi cố gắng để có được những lý lẽ Bundle nhưng tôi luôn có được null cách làm như sau ...

@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); 

    ... 
} 

Tôi thiếu gì ở đây? Tôi cũng đã thử số trong số onAttach(...) nhưng tôi vẫn bị vô hiệu. Tôi mới sử dụng Fragments vì vậy tôi hy vọng có một lý do đơn giản nhưng tôi đã không đưa ra bất cứ điều gì khi tìm kiếm.

Trả lời

43

Tôi nghĩ điều này đã làm với vấn đề của bạn:

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

Bạn đang thực hiện một Fragment (mà không có lý lẽ kể từ khi nó được tươi instantiated) mới.

Thay vì cố gắng

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

Oh bạn đã có được đùa tôi ... aaaargh! – Squonk

+2

Đôi khi tất cả những gì nó cần là một cặp mắt khác. Cảm ơn bạn! Tôi đã không ban đầu đi qua các đối số vì vậy tôi đã tạo ra 'Fragment' trong lệnh gọi' replace (...) '. Có một sự chậm trễ thời gian cho tôi để chấp nhận câu trả lời của bạn nhưng tôi sẽ làm như vậy. Cảm ơn một lần nữa. – Squonk

+1

@Squonk bạn được chào đón! Tôi nhớ lại một lần tôi quên mở rộng 'FragmentActivity'. Đó là nửa giờ tốt nhất của cuộc đời tôi cố gắng tìm ra điều đó :-) –