2012-06-05 39 views
86

Tôi thấy trong số Android Fragments Dev Guide rằng "hoạt động có thể gọi các phương thức trong một đoạn bằng cách lấy tham chiếu đến Phân đoạn từ Trình quản lý phân đoạn, sử dụng findFragmentById() hoặc findFragmentByTag()".Gọi phương thức Phân đoạn từ hoạt động gốc

Ví dụ sau đây cho thấy cách lấy tham chiếu phân đoạn, chứ không phải cách gọi các phương thức cụ thể trong đoạn.

Có ai có thể đưa ra ví dụ về cách thực hiện việc này không? Tôi muốn gọi một phương thức cụ thể trong một Fragment từ Activity cha. Cảm ơn.

Trả lời

159

không nhận được câu hỏi chính xác như nó là quá đơn giản:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.<specific_function_name>(); 
+9

OK thật dễ dàng, cảm ơn (Tôi hoàn toàn mới với phân đoạn). Bây giờ phần khó khăn là tôi không thể có vẻ để có được một tham chiếu đến các mảnh ở nơi đầu tiên. Nó không được định nghĩa trong một bố trí XML, vì vậy tôi không thể sử dụng findFragmentById().Và nó không rõ ràng với tôi từ mã tôi đang làm theo (ref trên) như thế nào/nơi các mảnh thậm chí còn được tạo ra. Nếu tôi chỉ có thể thêm một thẻ và sử dụng findFragmentByTag(). Phần AccountListActivity của ví dụ này có một cuộc gọi đến beginTransaction(). Add(), nhưng theo dấu vết của tôi, nó không bao giờ được gọi. Đây là nơi tôi gãi đầu. Tôi đánh giá cao bất kỳ đề xuất nào. – gcl1

+0

Xin lỗi, tôi đã bỏ qua tham chiếu. Mẫu mã tôi đang theo dõi là [FragmentTabsPager] (http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsPager.html). Cảm ơn. – gcl1

+0

Tình huống sẽ khác khi không có ID và TAG liên kết với đoạn. –

8

Nếu bạn đang sử dụng một thư viện hỗ trợ, bạn sẽ muốn làm một cái gì đó như thế này:

FragmentManager manager = getSupportFragmentManager(); 
Fragment fragment = manager.findFragmentById(R.id.my_fragment); 
fragment.myMethod(); 
66

Nếu bạn đang sử dụng “nhập khẩu android.app.Fragment;” Sau đó sử dụng một trong hai:

1)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

Trường hợp R.id.example_fragment rất có thể là id FrameLayout bên trong bố cục xml của bạn. HOẶC

2)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

đâu FragTagName là tên u quy định khi u đã làm:

TabHost mTabHost.newTabSpec(“FragTagName”) 

Nếu bạn đang sử dụng “android.support.v4.app nhập khẩu. Fragment; ” Sau đó, sử dụng:

1)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

HOẶC

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 
+1

Tôi có một CoordinatorLayout với id R.id.example_fragment, giá trị trả về của nó là null. Tôi đang sử dụng nhập android.support.v4.app.Fragment; phải làm gì? – Kishore

+0

Tôi khuyên bạn nên đăng câu hỏi này dưới dạng câu hỏi mới và bao gồm mã mẫu của bạn. Thật khó để nói nguồn gốc của vấn đề mà không thấy mã thực sự. – Gene

3
  1. Nếu bạn không sử dụng một thư viện hỗ trợ Fragment, sau đó làm như sau:

((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


2. Nếu bạn đang sử dụng một thư viện hỗ trợ Fragment, sau đó làm như sau:

((FragmentName) getSupportFragmentManager().findFragmentById(R.id.fragment_id)).methodName();

3

Tôi nghĩ rằng tốt nhất là để kiểm tra xem đoạn được bổ sung trước khi phương pháp gọi trong đoạn. Làm một cái gì đó như thế này để tránh ngoại lệ null.

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
if(fragment.isAdded()){ 
    fragment.<specific_function_name>(); 
} 
Các vấn đề liên quan