Android - Đặt id phân đoạn


111

Làm thế nào tôi có thể đặt một Fragment's Idđể tôi có thể sử dụng getSupportFragmentManager().findFragmentById(R.id.--)?


Bạn có thể đặt nó trong tệp xml bố cục
Vladimir Eremeev

Câu trả lời:


117

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 tagcá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 Fragmentvà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 Fragments, mà ViewGrouplà 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 Fragments sẽ yêu cầu bạn thêm ViewGroups động vào Bố cục cho mỗi lần Fragmentbạ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 FragmentTransactionthứ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 . Fragments không cần có Views! 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!


Nếu tôi sử dụng thẻ chứ không phải ID cho phân đoạn, làm cách nào để sử dụng lệnh gọi thay thế cần id tài nguyên phân đoạn?
Namratha

12
@TomDignan làm thế nào về một phân đoạn sẽ được thêm vào một ViewPager? Làm cách nào để đặt thẻ của anh ấy? Tôi không thể sử dụng giao dịch trong tình huống này.
GuilhE

1
@GuilhE Activity cung cấp một phương thức addFragment () mà bạn có thể tham chiếu từ viewpager. Giữ thẻ trước đó có thể được thực hiện với một bản đồ băm.
Thomas Dignan

1
Câu trả lời có thể được chỉnh sửa một chút để nhấn mạnh rằng bạn có thể đặt id trong bố cục xml không? Bởi vì cá nhân tôi đã không đọc các câu hỏi khác và có ấn tượng rằng không có cách nào để đặt id cho phân đoạn ...
Ivan

41

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.


4

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.


2

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, DialogFragmenthoặ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!


0

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);

Câu trả lời không liên quan đến câu hỏi. Hãy cập nhật câu trả lời. Happy Coding
CodeWithVikas

-1

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


-2

Ngoài câu trả lời của Tom, phương thức thay thế cũng hỗ trợ thẻ phân mảnh, ngoài phương thức thêm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.