Gọi một phương thức Fragment từ cha mẹ Hoạt động


124

Tôi thấy trong Hướng dẫn dành cho Android Fragment Dev rằng "một 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 Fragment từ FragmentManager, bằng cách sử dụng findFragmentById()hoặc findFragmentByTag()."

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

Bất cứ ai có thể đưa ra một ví dụ về cách làm điều này? Tôi muốn gọi một phương thức cụ thể trong Đoạn từ Hoạt động chính. Cảm ơn.

Câu trả lời:


210

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

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

Cập nhật: Dành cho những người đang sử dụng Kotlin

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()

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

34
Làm thế nào tôi có thể nhận được đoạn id?
Narendra Singh

8
Bằng cách này, tôi đã kết thúc một tài liệu tham khảo đối tượng null!
Alok Rajasukumaran

3
@Fattie, nếu tôi không có thẻ phân đoạn thì sao?
Vaclovas Rekašius Jr.

5
Tôi đã không khai báo đoạn trong xml ... vì vậy tôi không có id đoạn, tôi sẽ làm gì ??
akash bs

76

Nếu bạn đang sử dụng, nhập 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(); 

Trong đó R.id.example_fragment rất có thể là id FrameLayout bên trong bố cục xml của bạn. HOẶC LÀ

2)

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

Trong đó FragTagName là tên bạn được chỉ định khi bạn thực hiện:

TabHost mTabHost.newTabSpec(“FragTagName”)

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

1)

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

HOẶC LÀ

2)

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

1
Tôi có một Điều phối viên với id R.id.example_fragment, nó sẽ trả về null. Tôi đang sử dụng nhập android.support.v4.app.Fragment; phải làm sao
Kishore

Tôi đề nghị bạn đăng bài này như một 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 nhìn thấy mã thực tế.
Gene

9

Nếu bạn đang sử dụng 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();

4
  1. Nếu bạn không sử dụng Fragment thư viện hỗ trợ, thì hãy làm như sau:

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


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

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


3

Tôi nghĩ tốt nhất là kiểm tra xem đoạn được thêm vào trước khi gọi phương thức 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>(); 
}

2

Từ mảnh đến hoạt động:

((YourActivityClassName)getActivity()).yourPublicMethod();

Từ hoạt động đến phân đoạn:

FragmentManager fm = getSupportFragmentManager ();

//if you added fragment via layout xml
YourFragmentClass fragment = 
(YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();

Nếu bạn đã thêm đoạn qua mã và sử dụng chuỗi thẻ khi bạn thêm đoạn, hãy sử dụng findFragmentByTag thay thế:

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");

1

Đầu tiên bạn tạo phương thức theo ý fragmentthích của bạn

public void name()
{


}

trong activitybạn thêm cái này

thêm onCreate()phương thức

myfragment fragment=new myfragment()

cuối cùng gọi phương thức mà bạn muốn gọi thêm

fragment.method_name();

thử mã này


1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 

1

Tôi không biết Java, nhưng trong C#(Xamarin.Android) không cần phải tìm kiếm mảnh vỡ mỗi khi bạn cần gọi phương thức, xem bên dưới:

public class BrandActivity : Activity
{
    MyFragment myFragment;

    protected override void OnCreate(Bundle bundle)
    {       
        // ...
        myFragment = new MyFragment();      
        // ...
    }

    void someMethod()
    {
        myFragment.MyPublicMethod();
    }
}

public class MyFragment : Android.Support.V4.App.Fragment
{
    public override void OnCreate(Bundle bundle)
    {
        // ...
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
    {
        // ...
    }

    public void MyPublicMethod()
    {
        // ...
    }   
}

Tôi nghĩ rằng trong Javabạn có thể làm như vậy.


1

bạn cũng gọi phương thức phân đoạn bằng giao diện như

đầu tiên bạn tạo giao diện

public interface InterfaceName {
    void methodName();
}

Sau khi tạo giao diện, bạn thực hiện giao diện trong đoạn của mình

MyFragment extends Fragment implements InterfaceName {
    @overide
    void methodName() {

    }
}

và bạn tạo tham chiếu giao diện trong hoạt động của mình

class Activityname extends AppCompatActivity {
    Button click;
    MyFragment fragment;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);

        click = findViewById(R.id.button);

        fragment = new MyFragment();

        click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               fragment.methodName();
            }
        });
    }
}

0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
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.