如何初始化OnFragmentInteractionListener而不使用onAttach(上下文上下文)以与FirebaseUI一起使用

时间:2017-03-30 01:59:21

标签: android firebase firebaseui

我正在尝试让我的应用程序(使用com.firebase.ui和com.firebase.ui.auth)在旧的api level 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  

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

1 个答案:

答案 0 :(得分:0)

正如您在docs中所看到的那样,{23}已经从API 23向上弃用了onAttach(Activity),而是使用了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();
    }
}