【问题标题】:Call parent's activity from a fragment从片段中调用父母的活动
【发布时间】:2012-12-30 12:40:31
【问题描述】:

如果我在 Fragment 中,我如何调用父母的活动?

【问题讨论】:

  • 通过调用 getActivity()
  • 只需调用 getActivity();
  • 我做到了。但方法仍然不可见。
  • 你应该使用 requireActivity() 而不是 getActivity()

标签: android android-activity fragment


【解决方案1】:

是的,正确的方法是调用 getActivity 并将其与父活动一起转换以访问其方法或变量((ParentActivityName)getActivity())

试试这个。

ParentActivityName 是父类名

【讨论】:

  • 如果我们不知道名字怎么办?示例:我正在制作 sdk,其中包含所有片段。我不能要求 sdk 用户重命名他/她的活动。那么如何在不知道名字的情况下获得参考呢?
  • 您希望如何使用该参考?
  • 我明白了。我的用例是在库中制作 n 个片段并提供给商家。我不知道他们将在哪个 Activity 中使用片段。似乎制作一个接口,在 Activity 中覆盖它并从 Activity 中获取回调似乎是最佳实践,在我的场景中非常有帮助..
  • @kay 酷,就是这样!
  • 它有内存泄漏的可能性吗?即使我没有存储对父 Activity 的任何引用?
【解决方案2】:

2021 年更新

正如 cmets 中所说,Fragment#onAttach(Activity) is deprecated starting from 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 附加到片段时,您可以监听片段。

另请参阅:

【讨论】:

  • onAttach(Activity activity) 已弃用,请改用onAttach(Context context)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多