当前位置: 首页 > 知识库问答 >
问题:

Android片段OnAttach方法

李俭
2023-03-14

我是Android开发新手,对OnAttach(上下文)方法有疑问。据我所知,您在扩展Fragment的类中重写了OnAttach方法,它基本上是将片段附加到作为参数传递的活动(上下文)。然而,在我在互联网上看到的许多示例代码中,人们用主要活动需要实现的方法创建了一个接口,并且在OnAttach方法中,他们键入上下文作为ex的接口)

public class exampleFragment extends Fragment{

exampleFragmentListener activityCommander;

public interface exampleFragmentListener{
    public void someMethod(String top, String bot);

}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    try{
        activityCommander = (exampleFragmentListener)context;

    }catch(Exception e){
        throw new ClassCastException(context.toString());

    }
}

我不明白的是这段代码:

activityCommander = (exampleFragmentListener)context;

将上下文类型化为example pleFragmentListener的目的是什么?为什么我们要将我们的主活动类型化为片段?为什么主活动不能只实现接口/实现接口方法?提前谢谢你。

共有3个答案

沈巴英
2023-03-14

将变速器与以下代码一起使用的目的:

public void onAttach(Context context) {
    super.onAttach(context);
    try{
        activityCommander = (exampleFragmentListener)context;

    }catch(Exception e){
        throw new ClassCastException(context.toString());

    }
}

简单地说,就是制作一个活动和片段的死契约。每当活动不遵守契约时,活动和片段都会死。他们都会死于抛出异常。

有关onAttach的详细信息,请阅读我之前的回答:如果在片段代码中未重写onAttach(),该怎么办?

咸育
2023-03-14

这是一个片段到活动通信的示例:

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @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");
        }
    }

    ...
}

现在,片段可以通过使用OnHeadlineSelectedListener接口的mCallback实例调用onArticleSelected()方法(或接口中的其他方法)来传递消息并与活动进行通信。所以基本上它是用于回调的

马淇
2023-03-14

当我们希望一个片段与一个活动通信时,我们使用一个接口。现在假设如果有2个活动托管同一个片段,并且在运行时我们不知道该片段当前来自哪个活动。这就是我们使用onAttach()的原因。参数中提供给我们的Context是托管它的活动的上下文。因此,一旦我们有了强制转换的实例,我们就可以使用它与活动进行通信。

 类似资料:
  • 我更新了我的应用程序,使用了最新的支持库(23.0.0版),我发现他们不推荐使用Fragment类的onAttach()函数。 而不是: 现在是: 由于我的app使用的是弃用前通过的活动,我认为一个可能的解决方案是: 点击这里查看我几周前打开的bug报告,以及谷歌的人给出的答案。

  • 我正在尝试实现一个好的、可重用的片段,我很难选择设置交互回调的模式。我当然熟悉这些文档,但我对其中描述的方法有一些疑问。 假设我们有一个带有回调接口的片段: 到目前为止,我遇到了两种为片段设置回调的方法。 Android开发指南中描述的方式。 编写的代码不多 mCallbacks永远不会为null(只要片段还活着) 如果我们在活动中使用多个片段,将会变得混乱 简单的侦听器模式。 可以在任何位置设置

  • 问题内容: 我阅读了很多有关片段的文章,但是我仍然对如何做感到困惑。 我有一个MainActivity,它并排显示两个片段。在一个片段中,我有一个按钮,并在该片段的片段布局XML中定义 现在我要实现该方法 我以为必须在FragmentA.java中实现,而不是在MainActivity.java中实现。但是,只有在MainActivity.java中实现了该方法后,该方法才有效。这是为什么?对我而

  • 问题内容: 我想从fragmentA调用FragmentB(Class)的方法,我试图通过在fragmentA(class)中创建fragmentb的对象来尝试,但是在这里它不起作用是该类中fragmentA的代码,我有一个方法可以通过FragmentB类的方法 我想称这个为fragmentB的方法 我尝试通过fragmentA方法编写此代码,但出现错误 问题答案: 试试这个解决方案:

  • 问题内容: 我想拥有自己的内心 这是我的xml文件 我的档案 和我的Fragment类 启动应用程序时,我的片段中看不到任何地图视图 问题答案: 来自Josh Holtz在GitHub上的示例: 您应该添加在你喜欢 并实现你的喜欢