从片段中调用父母的活动
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);
【讨论】:
以上是关于从片段中调用父母的活动的主要内容,如果未能解决你的问题,请参考以下文章