
这几天做项目的时候,发现白天黑夜模式切换的时候,应用会崩溃。崩溃日志如下:
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();
}
然后完美的解决了这个黑夜白天模式切换,导致崩溃的问题。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)