Câu trả lời:
Bạn không thể đặt ID của một đoạn theo chương trình .
Tuy nhiên, có một String tag
cái mà bạn có thể đặt bên trong FragmentTransaction có thể được sử dụng để xác định duy nhất một Fragment.
Như Aleksey chỉ ra, bạn có thể vượt qua một ID để FragmentTransaction
's add(int, Fragment)
phương pháp. Tuy nhiên, điều này không chỉ định ID cho một Fragment. Nó chỉ định ID của a ViewGroup
để chèn Fragment
vào. Điều này không hữu ích cho mục đích tôi mong đợi của bạn, bởi vì nó không xác định duy nhất Fragment
s, mà ViewGroup
là s. Các ID này là các vùng chứa mà một hoặc nhiều đoạn có thể được thêm động vào. Sử dụng phương pháp như vậy để xác định Fragment
s sẽ yêu cầu bạn thêm ViewGroup
s động vào Bố cục cho mỗi lần Fragment
bạn chèn. Điều đó sẽ khá cồng kềnh.
Vì vậy, nếu câu hỏi của bạn là làm thế nào để tạo một số nhận dạng duy nhất cho một Fragment mà bạn đang thêm động, thì câu trả lời là sử dụng phương FragmentTransaction
thức add (int containerViewId, Fragmentgment, String tag) và phương thức findFragmentByTag (String)FragmentManager
của 's .
Trong một trong các ứng dụng của mình, tôi buộc phải tạo chuỗi động. Nhưng dù sao thì nó cũng không đắt đến mức so với FragmentTransaction thực tế.
Một ưu điểm khác của phương pháp thẻ là nó có thể xác định một Fragment không được thêm vào giao diện người dùng. Xem phương thức thêm (Fragment, String) của FragmentTransaction . Fragment
s không cần có View
s! Chúng cũng có thể được sử dụng để duy trì trạng thái tạm thời giữa các lần thay đổi cấu hình!
Hóa ra bạn có thể không cần biết id phân đoạn.
Từ các tài liệu:
public abstract Fragment findFragmentById (int id)
Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.
Phần quan trọng là "làm ID vùng chứa khi được thêm vào trong giao dịch".
vì thế:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_holder, new AwesomeFragment())
.commit();
và sau đó
AwesomeFragment awesome = (AwesomeFragment)
getSupportFragmentManager()
.findFragmentById(R.id.fragment_holder);
sẽ giúp bạn có được bất kỳ phân đoạn nào (tuyệt vời) được giữ trong R.id.fragment_holder.
Trong hầu hết các trường hợp, bạn có thể sử dụng thẻ phân đoạn cũng như ID.
Bạn có thể đặt giá trị thẻ trong FragmentTransaction.add(Fragment fragment, String tag );
. Sau đó, bạn có thể sử dụng lệnh FragmentManager.findFragmentByTag(String tab)
để tìm đoạn được đề cập.
Như Tom và những người khác đã đề cập, có nhiều cách để đặt một thẻ vào một phân đoạn và sử dụng thẻ đó để nhận dạng. Một vấn đề tiếp theo mà tôi gặp phải với các giải pháp đó là phân đoạn không nhận được thẻ cho đến khi nó được liên kết với Hoạt động (hoặc trên thực tế, FragmentManager
). Phải làm gì nếu một người cần xác định một phân đoạn trước khi nó được gắn thẻ?
Các giải pháp của tôi cho đến nay đều dựa vào thủ thuật (Java) lâu đời nhất trên thế giới: tạo một phân đoạn mẫu tối giản lấy id trong một trong các hàm tạo của nó và cung cấp một getFragmentId()
phương thức trả về id đó. Sau đó tôi để những đoạn cần nhận dạng sớm mở rộng mẫu đó và; thì đấy! Vấn đề đã được giải quyết.
Sức giải pháp này, thật không may, đòi hỏi một tập hợp các mẫu mảnh vỡ, một cho mỗi loại mảnh, ListFragment
, DialogFragment
hoặc đồng bằng cũ Fragment
(POFO ?!) mà cần xác định sớm. Nhưng điều này có thể quản lý được trong trường hợp các mảnh vỡ, tôi nghĩ, xem xét lợi ích được cung cấp.
Xin lỗi vì đã xé những vết thương đang lành :-)
Chúc mừng!
Sử dụng như sau:
Để thêm một đoạn:
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();
Để xác định phân đoạn hiện có:
getFragmentManager().findFragmentByTag(fragmentName);
Khi sử dụng thẻ, vui lòng đảm bảo thêm
fragmentTransaction.addToBackStack(null);
để Fragment của bạn được tiếp tục lại thay vì bị hủy như đã đề cập trong hướng dẫn dành cho nhà phát triển.
Nếu bạn không gọi addToBackStack () khi bạn thực hiện một giao dịch loại bỏ một phân đoạn, thì phân đoạn đó sẽ bị phá hủy khi giao dịch được cam kết và người dùng không thể điều hướng trở lại nó. Trong khi đó, nếu bạn gọi addToBackStack () khi xóa một phân đoạn, thì phân đoạn đó bị dừng và sau đó được tiếp tục lại nếu người dùng điều hướng trở lại.
Bạn có thể tìm thấy điều này ở cuối trang này .
Tôi đã mất khoảng 30 phút để cố gắng tìm ra lý do tại sao không tìm thấy Phân mảnh của tôi thông qua một findFragmentByTag();
cuộc gọi đơn giản