java.lang.IllegalArgumentException: The observer is null.异常解决

本文分析了一个使用Fragment进行界面切换的应用程序中出现的java.lang.IllegalArgumentException异常,并提供了两种解决方法:一种针对RecyclerView,另一种针对ListView。

出现场景: 我的代码实现是由一个fragment显示另一个fragment; 我没有使用replace实现, 而是使用的是add的形式, 然后截取到系统的返回方法进行的返回, 但是问题就出现在这, 当我显示第二个fragment之后, 我返回第一个fragment的时候, 就会崩溃, 抛出异常就是java.lang.IllegalArgumentException: The observer is null.

异常原因: 感觉很奇怪, 就查了查网上的解释发现: 重点内容我显示第二个fragment的时候没有销毁窗口, 只是给他覆盖了, 而我在第一次加载第一个fragment的时候, 调用onDetachedFromWindow();会把observer设置成null所以当第二次重用的时候在remove view时就会再次的调用onDetachedFromWindow();就会出现上边的那个错误;

解决办法:在adapter里重写方法
第一种, 当前使用的是RecyclerView

@Override
    public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
        if (observer != null){
            super.unregisterAdapterDataObserver(observer);
        }
    }

第二种: 当前使用的listview

@Override  
public void unregisterDataSetObserver(DataSetObserver observer) {  
    if (observer != null) {  
        super.unregisterDataSetObserver(observer);  
    }  
} 

ps: 个人是只当第二个fragment通过listview或者是recyclerview加载出现数据才会抛出这个异常!

这个异常 `java.lang.IllegalArgumentException: The view is not a child of CoordinatorLayout` 通常发生在你尝试使用 `BottomSheetBehavior.from(view)` 时,但传入的 `view` 并不是 `CoordinatorLayout` 的直接子视图。 ### 常见原因和解决方法: #### ✅ 原因: `BottomSheetBehavior` 只能作用于 `CoordinatorLayout` 的**直接子 View**。如果你尝试通过 `BottomSheetBehavior.from(findViewById(...))` 获取一个不在 `CoordinatorLayout` 中的视图,就会抛出此异常。 #### ✅ 解决方法: 1. **确保使用的是 `BottomSheetDialogFragment` 的正确结构** `BottomSheetDialogFragment` 默认使用的是 `com.google.android.material.R.id.design_bottom_sheet`,必须确保你获取的是这个 ID,并且它在 `CoordinatorLayout` 下。 ```java @Override public void onStart() { super.onStart(); BottomSheetDialog dialog = (BottomSheetDialog) getDialog(); if (dialog != null) { View bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet); if (bottomSheet != null) { BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); behavior.setPeekHeight(400); } } } ``` 2. **不要对非 BottomSheet 的 View 使用 `BottomSheetBehavior.from()`** 确保你传入的 View 是 `design_bottom_sheet` 或者你自定义的 `BottomSheet` 布局,并且是 `CoordinatorLayout` 的子 View。 3. **如果你自定义了布局**,请确保结构如下: ```xml <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:id="@+id/bottom_sheet" android:layout_width="match_parent" android:layout_height="300dp" android:background="@android:color/white" android:layout_gravity="bottom" android:elevation="8dp" android:fitsSystemWindows="true" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior" /> </androidx.coordinatorlayout.widget.CoordinatorLayout> ``` 4. **在 DialogFragment 中使用时注意时机** 一定要在 `onStart()` 或 `onActivityCreated()` 生命周期中获取 `BottomSheetBehavior`,不能在 `onCreateView()` 中获取,因为此时 Dialog 的内容还未绑定。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值