从片段中调用父母的活动

Posted

技术标签:

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

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

【问题讨论】:

通过调用 getActivity() 只需调用 getActivity(); 我做到了。但方法仍然不可见。 你应该使用 requireActivity() 而不是 getActivity() 【参考方案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 附加到片段时,您可以监听片段。

另请参阅:

http://developer.android.com/training/basics/fragments/communicating.html

【讨论】:

onAttach(Activity activity) 已弃用,请改用onAttach(Context context)【参考方案3】:

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

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

【讨论】:

以上是关于从片段中调用父母的活动的主要内容,如果未能解决你的问题,请参考以下文章

从android中的活动调用片段

从片段调用活动方法

如何从另一个活动中调用片段

如何从主要活动中调用片段方法

从片段内部调用活动方法[重复]

Android:从片段调用活动