2012-03-07 24 views
23

Tôi biết rằng khi bạn lần đầu tiên tạo một đoạn, bạn có thể chuyển đối số bằng cách sử dụng setArguments(Bundle) và truy xuất chúng trong đoạn bằng cách sử dụng .Có thể chuyển đối số cho một đoạn sau khi nó được thêm vào một hoạt động không?

Tuy nhiên, trong ứng dụng của tôi, tôi có các phần sẽ được tách ra và đính kèm nhiều lần sau khi chúng được thêm vào hoạt động. Khi đính kèm lại, tôi có thể cần phải chuyển một đoạn tranh luận để sửa đổi nội dung của nó trước khi gắn lại nó. Tôi có thể sử dụng setArguments lần đầu tiên tôi hiển thị đoạn, nhưng vào những dịp tiếp theo sẽ không hoạt động. savedInstanceState sẽ không hoạt động trong trường hợp này vì tôi sẽ không biết giá trị của đối số trước khi tách mảnh đó ra.

Tôi biết tôi chỉ có thể thực hiện một phương pháp mà tôi sẽ gọi trước khi đính kèm đoạn sẽ đặt đối số, nhưng có vẻ như đây là thứ có thể đã có trong API và tôi không thấy nó.

Có nội dung nào được tích hợp sẵn sẽ cho phép tôi thực hiện việc này hay tôi sẽ phải tự thực hiện việc này? Đối với hồ sơ, tôi đang sử dụng gói hỗ trợ (v4).

Rất cám ơn!

+0

Bạn có ý gì khi đính kèm lại? Các mảnh vỡ sẽ được gắn vào một hoạt động chỉ một lần (AFAIK) và nếu nó được tách ra khỏi hoạt động nó sẽ bị phá hủy. Bạn có nghĩa là khi người dùng nhấn nút quay lại, mảnh được trả về bố cục không? – 500865

Trả lời

12

Bạn chỉ có thể phơi bày một phương pháp trên đoạn của mình để đặt bất kỳ thứ gì bạn muốn chuyển cho nó. Để gọi nó, bạn có thể ví dụ: lấy mảnh từ backstack bằng thẻ hoặc giữ một tham chiếu cá thể xung quanh từ bất cứ nơi nào bạn đang gọi nó.

Điều này làm việc tốt cho tôi mặc dù bạn cần phải phòng thủ về kiểm tra null và cũng như nhận thức được vòng đời mà đoạn của bạn trải qua khi bạn đính kèm hoặc khởi động lại.

Từ những gì tôi có thể nói không có gì trong API ...

Cập nhật: Điều này vẫn đúng và hoạt động tốt. Tôi thấy rằng một khi điều này phức tạp hơn, nó sạch hơn và dễ sử dụng hơn như một eventbus Otto. Đề nghị cao imho.

+0

Các đối số mà tôi vượt qua là khá tầm thường - nó không thực sự nội dung đó sẽ được thêm vào đoạn nhưng mảnh sẽ hiển thị/ẩn nội dung dựa trên giá trị của nó. Dường như nó hơi quá đơn giản, điều đó khiến tôi nghĩ có lẽ có một API cho những gì tôi đang làm. Đoán không. Cảm ơn đã giúp đỡ! –

2

Có thể chuyển đối số cho một đoạn sau khi được thêm vào hoạt động không?

số


Nhưng nếu bạn đang tìm kiếm những cách thức để giao tiếp với các hoạt động mà một mảnh được gắn, bạn có thể làm điều đó một cách @manfred đã đề cập hoặc cách khác được mô tả trong Documentation

Có một cách thú vị khác để có 2 đoạn giao tiếp với nhau. Đó là bằng cách sử dụng các phương pháp setTargetFragmentgetTargetFragment. Ở đây, Nếu fragmentB có thể ảnh hưởng fragmentA, bạn sẽ setTargetFragment của fragmentB để fragmentA và khi những thay đổi cần phải được cập nhật để fragmentA từ bên fragmentB, bạn sẽ nhận được một tham chiếu đến nó bằng cách ((fragmentA) getTargetFragment()) và truy cập các phương pháp fragmentA để cập nhật nó.

Hy vọng điều đó sẽ hữu ích. Chúc may mắn.

+0

anh ta không hỏi về việc giao tiếp với mảnh vỡ, anh ta hỏi làm thế nào để thay đổi đối số một khi được đặt thành đoạn –

+0

"không" của bạn rất sai lạc và không chính xác, câu trả lời cho câu hỏi OPs, mà bạn cũng trích dẫn, được trả lời hoàn hảo bởi @ user3978046 trên –

19

Có, nếu bạn đã gọi setArguments (bó) trước khi đoạn của bạn trở nên hoạt động. Sau đó, mảnh của bạn từ đó sau khi có một gói mà bạn có thể cập nhật.Để tránh vấn đề của bạn, bạn phải cập nhật gói ban đầu và không được gọi hàm setArguments lần thứ hai. Vì vậy, sau khi xây dựng đoạn ban đầu của bạn, hãy sửa đổi các đối số phân đoạn bằng mã như

frg.getArguments().putString("someKey", "someValue"); 

Các đối số sẽ có sẵn trong đoạn của bạn và sẽ được duy trì và phục hồi trong khi thay đổi định hướng và như vậy.

Lưu ý rằng phương pháp này cũng hữu ích khi đoạn được tạo thông qua xml trong bố cục. Thông thường, người ta sẽ không thể đặt ra các lập luận về một mảnh như vậy; cách để tránh hạn chế này là tạo ra một constructor không có đối số mà tạo ra các gói lập luận như vậy:

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

Sau đó ở đâu đó trong phương pháp onCreate của hoạt động của bạn thì bạn sẽ làm gì:

FragmentManager mgr = this.getSupportFragmentManager(); 
Fragment frg = mgr.findFragmentById(R.id.gl_frgMyFragment); 
Bundle bdl = frg.getArguments(); 
bdl.putSerializable(MyFragment.ATTR_SOMEATTR, someData); 

này đặt dữ liệu vào gói đối số, sau đó sẽ có sẵn để mã trong đoạn của bạn.

+0

Ya, nhưng có cách nào để phân đoạn của bạn nhận thấy rằng bạn đã thêm đối số vào nhóm không? Tôi cho rằng tôi có thể thêm các đối số và sau đó đưa ra một phương thức trên đoạn mà hoạt động có thể gọi để buộc nó phải kiểm tra lại các đối số. Vấn đề với điều đó là hoạt động không biết giai đoạn nào trong vòng đời của mảnh vỡ. – Glaucus

Các vấn đề liên quan