2017-07-27 70 views
0

嘿我试图做到这一点tutorial现在我得到的问题是,当我启动应用程序它崩溃,因为我的片段的参数为空。我发现了一个答案,我必须从我的content_main.xml中删除片段,但是当我这样做时,应用程序启动但行为怪异,我不认为这是问题的正确答案。如何阻止在Java之前加载onCreate的片段?

所以我MainActivityFragment的OnCreate()是Java代码之前调用,所以我买了这个问题行:

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

请告诉我对这个问题的解决方案?

我的代码是github

回答

1

根据您的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 
    } 
} 

不要忘记以包装SecondFragmentnewInstance伴侣对象内的功能。

+0

感谢您的回答我更改了项目,但由于这里出现空指针异常,应用程序一直崩溃“page = this.arguments.getInt(”someInt“,0)”。如果我做了一些错误的更改,我推动了我的更改。我还在我的content_main.xml中添加了片段 –

+0

@JohannesGnadlinger删除包含的content_main布局,这将导致现在它工作的相同问题 – AlexTa

+0

!感谢您的帮助 –

相关问题