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

Posted

技术标签:

【中文标题】从片段内部调用活动方法[重复]【英文标题】:Calling Activity Method From Inside A Fragment [duplicate] 【发布时间】:2013-11-12 15:36:03 【问题描述】:

我正在尝试从片段屏幕调用活动中的方法。

我有一个名为 myMethod() 的方法,它位于名为 MyActivity 的活动中; 我有一个名为 Screen1Fragment 的片段。

我想从 Screen1Fragment 内部调用 MyActivity.myMethod(),但我不知道该怎么做。

以前 Screen1Fragment 是一个活动,所以我扩展了 MyActivity 以便我可以直接调用 我的方法()。 但我不得不将活动更改为用于滑动标签使用的片段。

提前致谢。

【问题讨论】:

((YourActivityClass) getActivity).myMethod(); developer.android.com/guide/components/… 嗨,当我尝试此操作时,我收到一条错误消息,提示无法从 FragmentActivity 转换为 MyActivity。 MyActivity 是否必须扩展 FragmentActivity 才能使用此代码。 嗨,Sherif - 你的方式昨天还有效,但今天却导致我的应用程序崩溃。如何将 logcat 附加到这篇文章? 【参考方案1】:

在您的片段中使用getActivity()

MyActivity activity = (MyActivity) getActivity();
activity.myMethod();

如果您不确定您的片段是否附加到 MyActivity,那么

 Activity activity = getActivity();
 if(activity instanceof MyActivity)
      MyActivity myactivity = (MyActivity) activity;
      myactivity.myMethod();
 

【讨论】:

嗨,第一种方法给了我一个错误,无法从 FragmentActivity 转换为 MyActivity。第二种方法不会给我一个错误,但它没有在按钮单击时加载方法。我只是将代码放在点击按钮内吗? 那么你应该从 FragmentActivity 而不是 Activity 扩展你的 Activity。 (公共类 MyActivity 扩展 FragmentActivity ...) 嗨,第一种方法效果很好,但是由于某种原因,当我尝试使用它时,我的应用程序现在崩溃了。 你是在 onAttach() 之后调用 getActivity() 吗?你确定它不返回null吗?你确定它是 MyActivity 的实例吗?将这些记录下来,您就得到了解决方案。尝试使用: Log.d("MyFragment", "getActivity(): "+getActivity());选角之前 感谢您回来。我不确定如何使用 log.d 这是我正在运行的代码:TestActivity activity = (TestActivity) getActivity();活动.myMethod();导致应用程序崩溃【参考方案2】:

你应该让你的片段完全独立于你附加的活动。 Fragments 的重点是您可以在不同的上下文中通过不同的活动重用它们。为了实现这一点,并且仍然能够从您的 Activity 调用方法,请遵循 official documentation 中推荐的以下模式。

在您的片段中

用方法定义一个公共接口

public interface MyFragmentCallback
    public void theMethod();

定义一个字段并获得一个演员表参考:

private MyFragmentCallback callback;
public void onAttach(Activity activity)
    callback = (MyFragmentCallback) activity
    super.onAttach(activity);

在您的活动中

在类定义中实现MyFragmentCallback。 在您的活动中实现theMethod()(Eclipse 会要求您这样做)

然后,从您的片段中,您可以调用callBack.theMethod()

这与简单地在 getActivity() 上调用您的方法之间的区别在于,您的片段不再与此特定活动配对。因此,您可以将其重新用于其他活动,例如一个用于手机,另一个用于平板电脑。

【讨论】:

这是正确的方法!根据谷歌文档! 如果单个活动中有多个片段,我们需要回调所有片段怎么办? @PareshBalar 是的【参考方案3】:

如果方法是MainActivity的静态方法,类似:

    public static void someMethod()

然后,它非常简单。只需拨打电话

   MainActivity.someMethod()

但是,我猜你真正想要的是从 Activity 类中访问一些函数。然后就可以在 Fragment 视图创建器中使用如下代码

   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)

        container.getContext().someMethod();

   

【讨论】:

IMO 这是不好的做法。 1.container可能为null,getContext()返回Context,你还是要检查MyActivity实例。 2. 您不想通过静态方法与 Activity 进行通信,因为这样就不可能拥有该 Activity 的 2 个实例。 好点。但我想在这种情况下没关系。似乎问题所有者想要在活动中使用一些滑动选项卡。我们很确定活动在那里。无论如何,我不建议使用静态方法。我猜真正的问题是什么。

以上是关于从片段内部调用活动方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

片段内部未调用 onActivityResult [重复]

将数据从活动发送到片段android工作室[重复]

如何从片段 KOTLIN 中调用意图 [重复]

在 android studio kotlin 中将数据从活动传递到片段(不重复,这些方法不起作用)

如何使用视图绑定从片段更改父活动中的视图[重复]

如何从片段获取数据到另一个活动? (不是容器活动)[重复]