从片段调用父活动

36

如果我在Fragment内部,如何调用父Activity?


3
通过调用getActivity()方法。 - Nermeen
只需调用 getActivity(); - Dixit Patel
我已经尝试过了,但是方法仍然不可见。 - user1746708
你应该使用requireActivity()而不是getActivity()。 - Aviv Profesorsky
3个回答

85

是的,通过调用getActivity并将其与父活动进行强制类型转换以访问其方法或变量是正确的 ((ParentActivityName)getActivity())

可以尝试这个。

ParentActivityName 是父类名称


如果我们不知道名称怎么办?例如:我正在制作SDK,其中包含所有片段。我不能要求SDK用户重命名他/她的活动。那么如何在不知道名称的情况下获取引用? - Karan
你想如何使用那个引用? - DcodeChef
1
明白了。我的使用案例是在库中制作n个片段并提供给商家。我无法知道他们会在哪个Activity中使用这些片段。似乎制作一个接口,在Activity中重写它并从Activity获取回调是最佳实践,并且在我的情况下非常有帮助。 - Karan
@kay 很酷,就是这样! - DcodeChef
1
它是否存在潜在的内存泄漏问题?即使我没有存储对父“Activity”的任何引用? - Eido95

17

2021年更新

根据评论所说,Fragment#onAttach(Activity) 从API 23开始已被弃用。替代方法是:

@Override
public void onAttach(Context ctx) {
    super.onAttach(ctx);
    
    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        // Only attach if the caller context is actually an Activity
        if (ctx instanceof Activity) {
          mCallback = (OnHeadlineSelectedListener) ctx;
        }
    } catch (ClassCastException e) {
          throw new ClassCastException(ctx.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}

最合适的方法是让您的Activity实现一个Interface并使用监听器。这样Fragment就不会与任何特定的Activity绑定,使其可重复使用。在Fragment中:
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    
    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (OnHeadlineSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}

那样一来,当片段附加到活动上时,您可以使Activity监听该片段。

另请参阅:


1
onAttach(Activity activity)已被弃用,请使用onAttach(Context context)代替。 - Yohanim

1

只需使用 getActivity() 方法调用您的父 Activity。

CardView cardView = (CardView) getActivity().findView(R.id.your_view);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接