如何防止在Java之前加载onCreate of Fragment?

时间:2017-07-27 13:43:26

标签: android android-fragments android-viewpager kotlin

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

因此我的MainActivityFragment的onCreate()在java代码之前调用,所以我遇到了这些问题:

Request.Browser.IsMobileDevice

这个问题的解决方案是什么?

我的代码在github

1 个答案:

答案 0 :(得分:1)

根据您的 GitHub 项目,您正在以错误的方式实施Fragment实例化。 当您调用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函数。