我正在尝试在片段中设置工具栏。
尽管Google Developer文档已更新为包括Kotlin代码(请参阅本页):
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my)
// Note that the Toolbar defined in the layout has the id "my_toolbar"
setSupportActionBar(findViewById(R.id.my_toolbar))
Run Code Online (Sandbox Code Playgroud)
它与活动(而不是片段)中工具栏的设置有关。
我发现这则SO帖子表明您不能只在片段中调用setSupportActionBar。报价:
片段没有这样的方法setSupportActionBar()。ActionBar是Activity的属性,因此要将工具栏设置为actionBar,您的活动应从ActionBarActivity扩展,然后可以在Fragment中调用:
...
如果您使用的是AppCompatActivity:
Run Code Online (Sandbox Code Playgroud)((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);
但是,上面给出的代码在Java中。
在Kotlin中我怎么称呼它?
我已经使用导航架构组件设置了我的应用。从一个片段导航到下一个片段可以正常工作。但是,我一直试图在该导航流中传递数据。
按照Navigation codelab应用程序的结构,我使用下面的代码在菜单项上单击从一个片段导航到另一个片段:
MainActivity.kt
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return NavigationUI.onNavDestinationSelected(item,
Navigation.findNavController(this, R.id.nav_host_fragment))
|| super.onOptionsItemSelected(item)
}
Run Code Online (Sandbox Code Playgroud)
我尝试通过如下修改代码将包分发给这里。Android Studio不会检测到任何错误,但是当我尝试执行菜单项单击时,我的应用程序崩溃了。请注意,我R.id.menu_edit作为参数传入,findNavController因为否则会得到'没有传递参数'viewId'构建错误的值-但我认为您通常会在不传递任何内容的情况下调用它。
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item?.itemId) {
R.id.menu_song_edit -> {
val songBundle = Bundle()
songBundle.putString("titleArg", song_title.toString())
this.findNavController(R.id.menu_song_edit).navigate(R.id.goto_songedit, songBundle) // *** this is line 96 where it crashes per the log ***
return true
}
else -> return NavigationUI.onNavDestinationSelected(item,
Navigation.findNavController(this, R.id.nav_host_fragment))
|| super.onOptionsItemSelected(item)
}
}
Run Code Online (Sandbox Code Playgroud)
从下面的崩溃日志。找不到NavController?
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.projects.arise.mytestapp, PID: 1162 …Run Code Online (Sandbox Code Playgroud) navigation parameter-passing android-fragments kotlin android-toolbar