从片段内调用活动方法

18

我正在尝试从Fragment屏幕中调用Activity中的方法。

我有一个名为myMethod()的方法,它在一个名为MyActivity的Activity中;我有一个叫做Screen1Fragment的Fragment。

我想要从Screen1Fragment内部调用MyActivity.myMethod(),但我不确定该如何实现。

以前,Screen1Fragment是一个Activity,因此我通过扩展MyActivity来直接调用myMethod()。但是,由于需要使用滑动选项卡,我不得不将Activity更改为Fragment。

提前致谢。


6
((YourActivityClass) getActivity()).myMethod(); 这行代码是在Android开发中常见的一种使用方法。它调用了一个名为myMethod()的方法,该方法属于YourActivityClass类,并且该方法是从当前活动(Activity)中调用的。 - Sherif elKhatib
http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity - jpm
嗨,当我尝试这个时,我收到一个错误,说无法从FragmentActivity转换为MyActivity。 我的活动(MyActivity)必须扩展FragmentActivity才能让我使用这段代码吗? - Android Learner
你好, Sherif - 你的方法昨天是有效的,但今天它导致我的应用程序崩溃了。 我怎样才能将logcat附加到这个帖子上? - Android Learner
3个回答

47

在你的片段中使用getActivity()

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

如果您不确定您的代码片段是否附加到MyActivity,则

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

你好, 第一种方法会提示无法将FragmentActivity转换为MyActivity的错误。 第二种方法没有报错,但是在按下按钮时不会加载该方法。我应该把代码放在按钮的点击事件里吗? - Android Learner
1
那么你应该将你的Activity从Activity扩展到FragmentActivity。(public class MyActivity extends FragmentActivity {...) - Sipka
我猜你把你的Fragment附加到了MainActivity而不是TestActivity上,所以getActivity()返回的实例是MainActivity,无法转换为TestActivity。 另外,你应该使用日志记录。它可以帮助调试,查看异常、日志变量等等...谷歌一下吧。 - Sipka
如何将我的片段附加到测试活动中。 或者请问我如何在TestActivity内调用方法。 - Android Learner
与MainActivity相同,但在TestActivity中使用相同的代码。 - Sipka
显示剩余6条评论

28

你应该让片段与附加它的活动完全独立。片段的重点在于您可以在不同活动的不同上下文中重用它们。要实现这一点并仍能够从您的活动调用方法,建议使用官方文档中推荐的以下模式。

在您的片段中:

  • 定义一个包含该方法的公共接口

  • 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()上调用方法的区别在于,您的片段不再与此特定活动配对。 因此,您可以将其与其他活动一起重复使用,例如一个用于手机,另一个用于平板电脑。


这是正确的方式!根据谷歌文档! - sandalone
1
在单个活动中有多个片段并且我们需要为所有片段回调时该怎么办? - Paresh Balar
@PareshBalar 是的 - Simran Sharma

0
如果该方法是MainActivity的静态方法,类似于:
    public static void someMethod(){}

然后,这很简单。只需调用

   MainActivity.someMethod()

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

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

        container.getContext().someMethod();

   }

2
在我看来,这是一种不好的做法。
  1. 容器可能为空,并且getContext()返回Context,你仍然需要检查是否为MyActivity实例。
  2. 你不想通过静态方法与Activity通信,因为这样就不可能有两个该Activity的实例。
- Sipka
1
好观点。但我想在这种情况下没问题。似乎问题所有者想要在活动中使用一些滑动选项卡。我们非常确定该活动存在。无论如何,我不建议使用静态方法。我猜测真正的问题是什么。 - Anson Yao

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