Android Fragment OnAttach方法

时间:2017-12-20 07:05:48

标签: java android android-fragments

我是Android开发的新手,对OnAttach(Context context)方法有疑问。据我所知,你在扩展Fragment的类中覆盖OnAttach方法,它基本上做的是将片段附加到作为参数传递的Activity(Context)。但是,在我在互联网上看到的很多示例代码中,人们创建了一个接口,其中包含主要活动需要实现的方法,并且在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;

类型转换上下文的目的是什么exampleFragmentListener?为什么我们将主要活动强制转换为片段?为什么主要活动不能实现{ {1}}接口方法?先感谢您。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

以下是片段到活动通信的示例:

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接口的onArticleSelected()实例调用mCallback方法(或接口中的其他方法)来向活动传递消息和 commuticate 。所以基本上它是回调

答案 2 :(得分:0)

使用onAttach和以下代码的目的:

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

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

    }
}

只是制作一份活动和片段的死合同。每当活动不遵守合同时,活动和片段都将失效。他们两个都会因为抛出异常而死亡。

有关onAttach的详细信息,请阅读我之前的回答:What if onAttach() is not overridden inside the fragment code?