android-fragments Android片段OnAttach方法

l7wslrjt  于 2022-11-14  发布在  Android
关注(0)|答案(4)|浏览(296)

我是Android开发的新手,对OnAttach(Context context)方法有一个疑问。据我所知,你在扩展Fragment的类中覆盖OnAttach方法,它基本上是将片段附加到作为参数传递的Activity(Context)上。然而,在我在互联网上看到的许多示例代码中,人们使用主Activity需要实现的方法创建一个接口,在OnAttach方法中,他们将context类型转换为接口,例如

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;

将上下文类型转换为exampleFragmentListener?的目的是什么?为什么我们要将main activity类型转换为**fragment?**为什么main activity不能只实现interface/implement接口方法?提前感谢。

lymnna71

lymnna711#

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

roejwanj

roejwanj2#

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

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()方法(或接口中的其他方法),该片段可以向Activity传递消息和通信

xzv2uavs

xzv2uavs3#

使用onAttach的目的同下面的代码:

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

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

    }
}

简单地说,就是让活动和片段签订一个死的契约。每当活动不遵守契约时,活动和片段都将死亡。它们都将通过抛出异常而死亡。
有关onAttach的详细信息,请阅读我之前的回答:如果onAttach()在片段代码中没有被覆盖呢?

svujldwt

svujldwt4#

将此添加到您的Fragemnt

Activity activity;
@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    activity = context instanceof Activity ? (Activity) context : null;
}

然后使用活动更改获取上下文()获取活动()要求活动()要求上下文()

相关问题