如何在没有 onAttach(Context context) 的情况下初始化 OnFragmentInteractionListener 以便与 FirebaseUI 一起使用
How to initialize OnFragmentInteractionListener without onAttach(Context context) for use with FirebaseUI
我正在尝试让我的应用程序(使用 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 设备上的代码 运行s 时,不会仅调用 onAttach(Activity activity) onAttach(Context context) 方法方法(与模拟器 运行ning 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
所以 - 到目前为止它似乎工作正常,到目前为止没有问题。我只是想知道我是否在这里遗漏了什么 - 这种方法是否会让我头疼,或者这是不好的做法 - 可能效率低下?
感谢您的任何见解!
正如您在 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();
}
}
我正在尝试让我的应用程序(使用 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 设备上的代码 运行s 时,不会仅调用 onAttach(Activity activity) onAttach(Context context) 方法方法(与模拟器 运行ning 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
所以 - 到目前为止它似乎工作正常,到目前为止没有问题。我只是想知道我是否在这里遗漏了什么 - 这种方法是否会让我头疼,或者这是不好的做法 - 可能效率低下? 感谢您的任何见解!
正如您在 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();
}
}