【问题标题】:Android Fragment OnAttach methodAndroid Fragment OnAttach 方法
【发布时间】:2017-12-20 07:05:48
【问题描述】:

我是 Android 开发新手,对OnAttach(Context context) 方法有疑问。据我了解,您在扩展 Fragment 的类中覆盖 OnAttach 方法,它的基本作用是将片段附加到作为参数传递的 Activity(Context) 上。但是,在我在互联网上看到的许多示例代码中,人们使用主 Activity 需要实现的方法创建接口,并且在 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? 的目的是什么我们为什么要将我们的主要活动类型转换为片段?为什么主要活动不能只实现interface/implement接口方法?先感谢您。

【问题讨论】:

标签: java android android-fragments


【解决方案1】:

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

【讨论】:

  • 所以对于每个片段,您将只有一个 Listener(接口),对吗?
  • 是的,只有一个接口用于与托管片段的活动进行通信。
  • 但是,不一定只有一个接口,你也可以有数百个。但是,当这项工作可以只用一个界面完成时,为什么要创建 100 个。
【解决方案2】:

以下是 Fragment 到 Activity 通信的示例:

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() 方法(或接口中的其他方法)来传递消息和通信到活动。所以基本上它是用于回调

【解决方案3】:

使用onAttach的目的如下代码:

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

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

    }
}

简单来说就是做一个Activity和Fragment的死契约。每当 Activity 不遵守合约时,Activity 和 Fragment 都会死亡。他们都会因抛出异常而死亡。

onAttach详情请看我之前的回答:What if onAttach() is not overridden inside the fragment code?

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多