2013-08-08 36 views
19

Tôi muốn chuyển đối số từ hoạt động của tôi tới một đoạn, được nhúng vào hoạt động. Phân đoạn được nhúng tĩnh trong bố cục xml. Tôi cố gắng để gọi setArgument() như thế này:Đặt đối số của phân đoạn từ hoạt động

setContentView(R.layout.detail_activity); 
DetailFragment detailFragment = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment); 
detailFragment.setArguments(getIntent().getExtras()); 

nhưng nó đã quá muộn, vì setArguments phải được gọi ngay lập tức sau khi tạo đoạn của. Chỉ có tôi thấy nó để getArguments() và thay đổi gói. Có cách nào tốt hơn không?

+0

tôi đề nghị bạn tham khảo http://stackoverflow.com/a/ 12739968/1554935 –

+1

Không, chúng tạo ra đoạn chương trình và đoạn của tôi là một phần của xml. – damluar

+0

Tôi có cùng một vấn đề. Ví dụ tôi đã nhìn thấy tất cả các mảnh thêm vào container của hoạt động. –

Trả lời

33

AFAIK, bạn không thể sử dụng setArguments() như thế khi bạn nhúng đoạn trong XML. Nếu nó quan trọng, thay vào đó, bạn nên tự động thêm phân đoạn. Tuy nhiên, nếu bạn thực sự muốn phân đoạn được nhúng qua XML, có nhiều cách khác nhau mà bạn có thể truyền theo dữ liệu đó.

  1. Cho phép Hoạt động triển khai trình xử lý sự kiện của phân đoạn. Có đoạn sau đó yêu cầu các tham số cần thiết từ Hoạt động khi tạo hoặc bất cứ khi nào cần. Communication with Fragment
  2. Tạo thuộc tính tùy chỉnh có thể được nhúng trong xml cùng với đoạn. Sau đó, trong quá trình lạm phát của phân đoạn, phân tích các thuộc tính tùy chỉnh để lấy dữ liệu của chúng. Custom fragment attributes
  3. Tạo người định cư công khai trong đoạn và sử dụng chúng trực tiếp. Nếu điều quan trọng là đặt chúng trước phương thức onCreate() của đoạn, hãy thực hiện theo phương thức onAttachFragment() của hoạt động.
+2

'onAttachFragment()' là một mẹo tuyệt vời. Cảm ơn! –

+0

đây là một câu trả lời tuyệt vời, tại sao nó không được chấp nhận? Mặc dù cần thêm rằng đây là những xung quanh công việc và trừ khi phân đoạn là tĩnh và khép kín theo cách được đề xuất là đính kèm đoạn vào khung nhìn được xác định bởi Activity # setContentView – 43matthew

+1

onAttachFragment() không được gọi. Tôi có thiếu cái gì không? – clu

5

Bạn có hai lựa chọn ở đây

  1. Nếu bạn chỉ cần thông tin trong ý định của hoạt động, sau đó đặt thông tin từ mục đích vào các đối số đoạn chỉ cần thêm một bước không cần thiết. Bạn có thể chỉ là một giữ tốt những điều đơn giản và từ bạn gọi đoạn

    Bundle data = getActivity().getIntent().getExtras(); 
    
  2. Nếu bạn cần thêm thông tin mà không có trong ý định của hoạt động sau đó trong bạn mảnh tạo ra một không constructor tham số như:

    public DetailFragment() { 
        this.setArguments(new Bundle()); 
    } 
    

sau đó trong hoạt động của bạn, bạn có thể thêm bất cứ điều gì đối số bạn cần với các mã như:

DetailFragment frg = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment); 
    frg.getArguments().putBundle("key", data); 

điểm ở đây là sử dụng đối tượng bó hiện có thay vì cố gắng gọi setArguments() sau khi đoạn đã được đính kèm vào hoạt động.

+0

PutBundle được đặt sau setContentView, phải không? Vì vậy, đoạn được tạo ra trước khi chúng tôi thêm gói. Chúng ta có cần làm mới mảnh vỡ không? Cảm ơn. – stenlytw

4

Một cách khác để truyền dữ liệu cho Fragment là như sau:

//In DetailFragment (for Instance) define a public static method to get the instance of the fragment 

public static final DetailFragment getInstance(Bundle data) { 
    DetailFragment fragment = new DetailFragment(); 
    fragment.setArguments(data); 
    return fragment; 
} 

Và khi gắn DetailFragment từ bên trong Hoạt động

Bundle data = new Bundle(); 
//Add data to this bundle and pass it in getInstance() of DetailFragment 
fragmentTransaction.replace(R.id.frament_layout, DetailFragment.getInstance(data)); 
Các vấn đề liên quan