2013-10-01 19 views
20

Bắt đầu từ Android 4.2, Android hỗ trợ nested Fragments. Tài liệu không đưa ra nhiều lời giải thích liên quan đến vòng đời Fragment vòng đời nhưng từ kinh nghiệm, nó xuất hiện vòng đời của chúng thực sự tương tự như "thường lệ" Fragments.Nhận tham chiếu đến một đoạn con sau khi Phân đoạn gốc đã được tạo lại

Có vẻ như có một điểm khác biệt lớn: con Fragments không được khôi phục khi phương thức cha mẹ FragmentonCreate được gọi. Kết quả là, có vẻ như không thể lưu/khôi phục lại một tham chiếu đến một đặc biệt Fragment:

  • Sử dụng getChildFragmentManager.findFragmentByTag(String) luôn trả null trong mẹ FragmentonCreate(Bundle)mActivenull.
  • Sử dụng putFragment/getFragment kết quả trong một NullPointerExceptiongetFragment tìm kích thước của một số trống mActiveArrayList.

Vì vậy, câu hỏi của tôi khá đơn giản. Có cách nào đúng để truy xuất tham chiếu đến một đứa trẻ Fragment trong phương thức cha mẹ FragmentonCreate không?

+0

'getChildFragmentManager(). GetFragments()' có tham chiếu đến đoạn con không? –

+1

Tôi chỉ làm việc với sự hỗ trợ của các đoạn lồng nhau, nhưng những gì tôi có thể nói là các phần lồng nhau được tạo lại ở đó và cho các tình huống động bạn làm theo "kiểm tra nếu phân mảnh được gắn thẻ trong trình quản lý phân đoạn con, nếu không tạo ra mảnh mới" chu kỳ. Điều này làm việc khá tốt cho tôi khi tôi sử dụng các mảnh con như "công nhân" chẳng hạn. –

Trả lời

25

Tôi không nghĩ rằng bạn có thể ở chế độ xem onCreate vì chế độ xem không được xây dựng tại thời điểm đó. Bạn có thể mặc dù trong onViewCreated(). Logic tôi sử dụng là:

  • Kiểm tra nếu có sẽ được lưu trạng thái trong onViewCreated(), nếu có, hãy thử để có được những mảnh vỡ con
  • Sau đó kiểm tra xem đoạn con là null, nếu nó là, thêm nó sử dụng người quản lý mảnh trẻ em.

Bằng cách "kiểm tra", tôi muốn tìm kiếm phân đoạn theo id. Tôi đoán bằng thẻ cũng nên hoạt động.

AFAIK bạn không thể có được một đoạn con trước hệ thống phân cấp xem được phục hồi hoặc tạo ra, nhưng bạn có thể làm như vậy lúc sau, ví dụ như trong onActivityCreated()

+0

Tôi đồng ý với câu trả lời này. Đối với một mảnh không đầu, tôi sử dụng hook 'onActivityCreated' để truy cập vào các mảnh con. – jayeffkay

1

gì về setRetainInstanceState (true) trên của bạn miếng? Có thể giải quyết vấn đề của bạn không? Nó giải quyết một số vấn đề khi tôi có ChildFragments trong một Fragment. Tôi chỉ phải giữ một tham chiếu đến việc nuôi con trong mảnh vỡ.

Nhưng tôi đã làm điều đó trong onCreateView(). Không chắc liệu nó có hoạt động trong onCreate()

Hay bạn có ý nghĩa gì đó hoàn toàn khác?

0

là u có sử dụng FragmentPagerAdapter không? nếu không thử FragmentPagerAdapter thay vì FragmentStatePagerAdapter Tôi nhận ra rằng có một số lỗi khi sử dụng FragmentStatePagerAdapter khi tôi có 4 cấp tổ. Xin lỗi tiếng anh của tôi kém.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState != null) { 
    mFragment1 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment1); 
    mFragment2 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment2); 
    mFragment3 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment3); 
    } else { 
    mFragment1 = SomeFragment.newInstance("param1"); 
    mFragment2 = SomeFragment.newInstance("param2"); 
    mFragment3 = SomeFragment.newInstance("param3"); 
    } 
    super.onCreate(savedInstanceState); 
    mMyPagerAdapter = new MyPagerAdapter(getChildFragmentManager(), mFragment1, mFragment2, mFragment3); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    if (mFragment1 != null) { 
     getFragmentManager().putFragment(outState, STATE_Fragment1, 
       mFragment1); 
    } 

    if (mFragment2 != null) { 
     getFragmentManager().putFragment(outState, STATE_Fragment2, 
       mFragment2); 
    } 

    if (mFragment3 != null) { 
     getFragmentManager().putFragment(outState, STATE_Fragment3, 
       mFragment3); 
    } 

    super.onSaveInstanceState(outState); 
} 
Các vấn đề liên quan