如何防止在Java之前加载碎片的创建?

嘿,我试图做这个教程,现在我得到的问题,当我启动应用程序崩溃,因为我的片段的参数为空。 我发现一个答案,我必须从我的content_main.xml中删除片段,但是当我这样做的应用程序启动,但行为怪异,我不认为这是正确的答案的问题。

所以我的MainActivityFragment的onCreate()在java代码之前调用,所以我得到了这样的问题:

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) page = this.arguments.getInt("someInt", 0) title = this.arguments.getString("someTitle") } 

什么是正确的解决方案?

我的代码在github上

根据你的GitHub项目,你正在以错误的方式实现Fragment实例化。 当你invoque var fragment = MainActivityFragment() ,你创建了你的片段的新实例,但没有提供arguments ,所以,当你的片段onCreate方法被调用时,参数为null ,这就是为什么你的应用程序崩溃的原因。

要解决您的应用程序崩溃,您需要按以下方式实现片段实例化:

MainActivityFragment (已编辑)

 // Wrap new instance function inside companion object companion object { // newInstance constructor for creating fragment with arguments fun newInstance(page: Int, title: String): MainActivityFragment { val fragmentFirst = MainActivityFragment() val args = Bundle() args.putInt("someInt", page) args.putString("someTitle", title) fragmentFirst.arguments = args return fragmentFirst } } //... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if(null != this.arguments) { page = this.arguments.getInt("someInt", 1) title = this.arguments.getString("someTitle") } } 

MyPagerAdapter

 override fun getItem(position: Int): Fragment? { when (position) { 0 // Fragment # 0 - Ensure to return a new fragment instance with valid arguments -> return MainActivityFragment.newInstance(0, "Page # 1") 1 // Fragment # 0 - This will show FirstFragment different title -> return SecondFragment.newInstance(1, "Page # 2") else -> return null } } 

不要忘记在伴随对象中包装SecondFragment的 newInstance函数。