activity 实现底部弹窗的BottomSheetDialog,但在activity中获取 BottomSheetDialog所在的fragmente 实例为null
时间: 2024-03-02 11:53:40 浏览: 24
如果在 Activity 中获取 BottomSheetDialog 所在的 Fragment 实例为 null,可能是因为调用时机不正确造成的。
具体来说,当你在 BottomSheetDialog 的 onStart() 方法中尝试获取 Fragment 实例时,可能还没有完成 Fragment 的生命周期,因此获取到的实例为 null。
解决这个问题的方法是,将获取 Fragment 实例的代码放到 BottomSheetDialog 的 show() 方法之后,或者在 BottomSheetDialog 中定义一个回调接口,在 Fragment 中实现该接口并在接口中获取 Fragment 实例。
具体实现方式如下:
1. 在 BottomSheetDialog 中定义一个回调接口。
```java
public interface OnSheetDismissListener {
void onSheetDismiss(Fragment fragment);
}
```
2. 在 BottomSheetDialog 中设置 OnDismissListener,当 BottomSheetDialog 关闭时触发回调。
```java
public class MyBottomSheetDialog extends BottomSheetDialog {
private OnSheetDismissListener listener;
public MyBottomSheetDialog() {
super(requireContext(), R.style.BottomSheetDialogTheme);
}
public void setOnSheetDismissListener(OnSheetDismissListener listener) {
this.listener = listener;
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (listener != null) {
String tag = getTag();
Fragment currentFragment = getSupportFragmentManager().findFragmentByTag(tag);
listener.onSheetDismiss(currentFragment);
}
}
}
```
3. 在 Fragment 中实现 OnSheetDismissListener 接口,并在接口中获取 Fragment 实例。
```java
public class MyFragment extends Fragment implements OnSheetDismissListener {
@Override
public void onSheetDismiss(Fragment fragment) {
// 获取 fragment,进行相关操作
}
// 在需要调用 BottomSheetDialog 的地方注册监听器
MyBottomSheetDialog bottomSheetDialog = new MyBottomSheetDialog();
bottomSheetDialog.setOnSheetDismissListener(this);
bottomSheetDialog.show(getSupportFragmentManager(), "bottomSheetDialogTag");
}
```
通过这样的方式,在 Fragment 中可以获取到 BottomSheetDialog 所在的 Fragment 实例,并进行相关操作。