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

onAttach(Activity)已弃用:在这里,我可以检查Activity是否实现回调接口

乐正秦斩
2023-03-14

在API23之前,我使用片段的onAttach方法来获取我的侦听器实例,然后在onDetach内部清除引用。例如:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mListener = null;
    try {
        mListener = (SellFragmentListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement SellFragmentListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

在onAttach(上下文)中执行相同的检查安全吗?还是有更好的方法获取holder活动实例?

共有3个答案

龙永逸
2023-03-14

不推荐使用的是onAttach(活动) 方法,但整个流程仍保留。所以你可能什么都不做,比如onAttach(活动) 仍将被支持足够长的时间。

祁默
2023-03-14

如Zsolt Mester的回答所示,onAttach(活动活动)不建议使用onAttach(上下文上下文)。因此,您所需要做的就是检查以确保上下文是一个活动。

在Android Studio如果你去文件

import android.support.v4.app.Fragment;
...

public class MyFragment extends Fragment {

    private OnFragmentInteractionListener mListener;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // inflate fragment layout
        return inflater.inflate(R.layout.fragment_myfragment, container, false);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
}

笔记

>

  • 由于父活动必须实现我们的OnFragmentInteractionListener(任意命名的接口),检查(OnFragmentInteractionListener的上下文实例)确保上下文实际上是活动。

    请注意,我们正在使用支持库。否则onAttach(上下文上下文)不会被Android的API 23版本调用

    另见

    • 创建和使用片段

  • 薛栋
    2023-03-14

    检查源代码:

    /**
     * Called when a fragment is first attached to its context.
     * {@link #onCreate(Bundle)} will be called after this.
     */
    public void onAttach(Context context) {
        mCalled = true;
        final Activity hostActivity = mHost == null ? null : mHost.getActivity();
        if (hostActivity != null) {
            mCalled = false;
            onAttach(hostActivity);
        }
    }
    
    /**
     * @deprecated Use {@link #onAttach(Context)} instead.
     */
    @Deprecated
    public void onAttach(Activity activity) {
        mCalled = true;
    }
    

    因此,如果存在主机活动,onAttach(上下文上下文)将调用onAttach(活动活动)。您可以安全地使用onAttach(活动)

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

    • 问题内容: 在阅读有关将容器链接在一起的知识时,他们现在将其称为 旧版链接, 本文声称在Docker 1.9中已弃用,[发行说明中未提及此内容,弃用功能列表也未提及。 题 为什么Docker现在需要旧版链接?我应该停止使用它们吗? 问题答案: 泊坞窗网络被晋升为继任者- https://docs.docker.com/engine/userguide/networking/ 在使用Docker网络

    • 我在TypeScript中使用一个接口来定义一个函数,该函数仅在扩展基类的一些类上可用。这是我到目前为止的代码的简化版本: 现在,问题是我会添加更多的“行走”动物,这样移动动物的功能就会变得太大而无法控制。我想做的事情是这样的: 但是,“implements”检查不起作用,在使用接口时,我找不到与“instanceof”等效的。在Java中,“instanceof”的使用似乎可以在这里使用,但Ty

    • 问题内容: 我在对此答案的评论中阅读了有关过时的计划(抱歉,没有参考)的其他许多问题。我真的希望不要,因为我将它用作Java中调度事情的简便方法(而且效果很好)。但是,如果过时了,我会去别处。 但是,快速浏览 1.6版 的API文档并没有说明它已被弃用。Sun的“ 不推荐使用的清单”中甚至都没有提到它。 是否正式弃用 *,如果是,我应该使用什么代替? 另一方面, 如果不弃用它,* 人们是否可以停止

    • 问题内容: 您已经意识到了一个古老的问题:包含浮动元素的容器不会自动扩展其高度以围封其子级。 解决此问题的一种方法是“clearfix”,它添加了许多CSS规则以确保容器正确延伸。 但是,仅提供容器似乎同样有效,并且具有相同的浏览器兼容性。 这是否意味着不建议使用“ clearfix”?使用它还有什么优势吗? 这里有一个非常相似的问题:clearfixhack和overflow:hidden与ov

    • 问题内容: 假设我有一个Python函数和。旨在以递归方式调用自身。不应递归调用。有没有办法确定是否已递归调用它? 问题答案: 为此使用追溯模块: 因此,如果堆栈中的任何条目指示从调用了代码,则该调用是(间接)递归的。该方法使您可以轻松访问此数据。下面的示例中的语句仅计算函数名称的完全匹配数。为了使它更漂亮(感谢agf的想法),您可以将其变成装饰器: