解决白天黑夜模式切换导致Fragment崩溃问题

解决白天黑夜模式切换导致Fragment崩溃问题,第1张


这几天做项目的时候,发现白天黑夜模式切换的时候,应用会崩溃。崩溃日志如下:

Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment xxx.MainPageFragment: could not find Fragment constructor
        at androidx.fragment.app.Fragment.instantiate(Fragment.java:563)
        at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57)
        at androidx.fragment.app.FragmentManager$3.instantiate(FragmentManager.java:390)
        at androidx.fragment.app.FragmentStateManager.(FragmentStateManager.java:74)
        at androidx.fragment.app.FragmentManager.restoreSaveState(FragmentManager.java:2452)
        at androidx.fragment.app.FragmentController.restoreSaveState(FragmentController.java:196)
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:287)
        at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:115)
        at com.bangcle.andJni.JniLib1646222368.cV(Native Method)
        at com.xxx.appbar.BaseBarActivity.onCreate(Unknown Source:18)
        at com.xxx.appbar.BaseBottomInOutBarActivity.onCreate(BaseBottomInOutBarActivity.java:10)
        at xxx.services.base.BaseActivity.onCreate(BaseActivity.java:49)
        at xxx.MainActivity.onCreate(MainActivity.java:50)
        at android.app.Activity.performCreate(Activity.java:7144)
        at android.app.Activity.performCreate(Activity.java:7135)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2931)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086) 
        at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:4823) 
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4732) 
        at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:69) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6718)


 

看崩溃日志,我们发现是在系统在创建Fragment的时候发生了崩溃。这也是为什么google不推荐我们重写fragment构造方法的原因。

那如何解决这个问题呢?最简单的方式自然是不重写fragment的构造方法就好了。

原构造方法:

 public MainPageFragment(ViewData viewData, ShowCarMainPresenter presenter) {
        super();
        this.viewData = viewData;
        this.presenter = presenter;
    }

改为

public MainPageFragment() {
     super();
}

viewData是数据,presenter是执行器。

这样原来的崩溃问题是解决了,但是又带来了新问题,viewData和presenter如何传递到Fragment中呢?由于走的是系统创建fragment的流程,并且是在activity的onCreate方法中执行的,所以我们根本来不及传递viewData和presenter进去。

转念一想,即然不方便主动传递进去,那么我在Fragment创建的时候主动向activity拿可以吗?试了一下,果然可以,代码如下:

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        this.viewData = ((MainActivity) getActivity()).getViewData();
        this.presenter =  ((MainActivity) getActivity()).getMainPresenter();
}

然后完美的解决了这个黑夜白天模式切换,导致崩溃的问题。


 

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/992584.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-21
下一篇2022-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存