【问题标题】:How to initialize OnFragmentInteractionListener without onAttach(Context context) for use with FirebaseUI如何在没有 onAttach(Context context) 的情况下初始化 OnFragmentInteractionListener 以与 FirebaseUI 一起使用
【发布时间】:2017-08-23 17:57:36
【问题描述】:

我正在尝试让我的应用程序(使用 com.firebase.ui 和 com.firebase.ui.auth)在旧的 api 级别 15 (4.0.4) 设备上运行。首先我使用清单标签:

 <uses-sdk tools:overrideLibrary="com.firebase.ui, com.firebase.ui.auth"/> 

但后来我发现在旧设备上没有调用 onAttach(Context...) 方法。
所以我读了一些关于它的帖子,这是我根据我读到的内容得出的:

  @SuppressWarnings("deprecation")
    @Override
    public void onAttach(Activity activity) {

        Log.d(TAG, "onAttach Activity 1A "  );
        super.onAttach(activity);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            setmListener(activity );
        }

    }

    private void setmListener(Context context){
        Log.d(TAG, "setmListener 1  "  );
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onAttach(Context context) {
        Log.d(TAG, "onAttach Context 1 "  );
        super.onAttach(context);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            setmListener(context);
        }
    }

当代码在旧的 api 15 设备上运行时,onAttach(Context context) 方法不会只调用 onAttach(Activity activity) 方法(对于运行 Lollipop 的模拟器也是如此)。

 D/StSt_MaxWListFrag: onAttach Activity 1A 
 D/StSt_MaxWListFrag: setmListener 1  

但是在具有 M 的设备上,两种方法都运行,但 setmListener 只按预期调用一次:

D/StSt_MaxWListFrag: onAttach Context 1 
D/StSt_MaxWListFrag: onAttach Activity 1A 
D/StSt_MaxWListFrag: setmListener 1  

所以 - 到目前为止它似乎正在工作,到目前为止没有任何问题。我只是想知道我是否在这里遗漏了一些东西-这种方法是否会让我感到头疼,或者它是不好的做法-可能效率低下? 感谢您的任何见解!

【问题讨论】:

    标签: android firebase firebaseui


    【解决方案1】:

    正如您在 docs 中看到的,onAttach(Activity) 从 API 23 开始已被弃用,而是使用 onAttach(Context)onAttach(Activity) 不会自动调用新的onAttach(Context)

    因此,为了支持所有版本的 API 并只执行一次附加操作,您必须在函数中分离附加逻辑,并从执行检查的两个回调中调用该函数:

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        attached();
    }
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            attached();
        }
    }
    

    【讨论】:

    • 这不是我做的吗?所以你是说我没有错过任何东西?除了你的代码更简洁,只有一个 -if- 语句。
    • 是的,我最终确认了你的想法。
    猜你喜欢
    • 2016-05-21
    • 2020-09-05
    • 1970-01-01
    • 2019-06-17
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    相关资源
    最近更新 更多