2011-08-12 5 views
26

Tôi đang bắt đầu một Hoạt động thông qua các phương tiện thông thường:Fragments onCreateView() bundle. Nó đến từ đâu?

Intent startIntent = new Intent(this, DualPaneActivity.class); 
startIntent.putExtras(((SearchPageFragment) currentFragment).getPageState()); 
startActivity(startIntent); 

Khi hoạt động này tải, nó đặt một Fragment trong một khung như vậy:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
Fragment currentFragment = fragment; 
currentFragment.setArguments(getIntent().getExtras()); 
transaction.replace(R.id.singlePane, currentFragment); 
transaction.commit(); 

Có vẻ đơn giản, phải không?

Tuy nhiên, bạn có thể bên trong onCreateView() truy cập phương pháp ba bó riêng biệt (bốn, nếu bạn bao gồm một trong những bao gồm trong của Fragment onCreate(Bundle savedInstanceState)):

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    // Fill state information 
    Bundle bundle; 
    if(savedInstanceState != null) bundle = savedInstanceState; // 1  
    else if(getArguments() != null) bundle = getArguments();  // 2 
    else       bundle = getActivity().getIntent().getExtras(); // 3 
    setPageState(bundle); 
} 

Trong ví dụ ở trên, tôi đã làm việc ra từ thử nghiệm và lỗi mà gói tôi muốn là gói thứ hai, gói được truy xuất từ ​​.

Từ hiểu biết của tôi, câu hỏi thứ ba từ getActivity().getIntent().getExtras(); thực sự gọi Bundle từ mục đích được sử dụng để bắt đầu chứa hoạt động. Tôi cũng biết từ thử nghiệm rằng savedInstanceState dường như luôn là rỗng. Nhưng nó đến từ đâu và lý do tại sao là nó không?

Các documentation nói điều này:

savedInstanceState Nếu không null, đoạn này đang được tái xây dựng từ một trạng thái đã lưu trước khi đưa ra ở đây.

Điều đó không giúp ích cho tôi - Điều đó làm tôi khó chịu hơn là không cho tôi tiếp tục. Ai đó có thể giúp tôi với sự khó chịu này?

Trả lời

12

Theo hiểu biết tốt nhất của tôi, onCreateViewonCreate() đều được chuyển gói từ onSaveInstanceState().

Vì vậy, nếu bạn ghi đè onSaveInstanceState() và đặt dữ liệu trong gói, bạn sẽ có thể truy xuất dữ liệu trong onCreateView(). Đó là lý do tại sao tài liệu nói rằng gói sẽ không rỗng khi đoạn được xây dựng lại từ trạng thái đã lưu trước đó.