【发布时间】:2017-10-09 15:44:37
【问题描述】:
我正在开发一个只有几个屏幕的小型应用程序,我想将其实现为一个调用多个片段的单个 Activity。我在 Java for Android 方面有一些经验,但使用 Kotlin 是一个新领域。 我已经了解如何在 Kotlin 中添加片段,但我想以可重用的方式进行。 我遇到了here 提到的解决方案,它可以工作,但有些东西我不太明白。到目前为止,我的以下 MainActivity 有效,但我必须像我在这里所做的那样在 onCreate 方法中创建 var welcomeFragment:
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
val toggle = ActionBarDrawerToggle(
this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
drawer_layout.addDrawerListener(toggle)
toggle.syncState()
nav_view.setNavigationItemSelectedListener(this)
var welcomeFragment = Fragment.instantiate(this@MainActivity,
WelcomeFragment::class.java!!.getName())
addFragment( welcomeFragment, welcome)
}
inline fun android.support.v4.app.FragmentManager.inTransaction(func: android.support.v4.app.FragmentTransaction.() -> android.support.v4.app.FragmentTransaction) {
beginTransaction().func().commit()
}
fun AppCompatActivity.addFragment(fragment: Fragment, frameId: Int){
supportFragmentManager.inTransaction { add(frameId, fragment) }
}
fun AppCompatActivity.replaceFragment(fragment: Fragment, frameId: Int) {
supportFragmentManager.inTransaction{replace(frameId, fragment)}
}
}
我似乎不明白为什么我不能声明该属性并稍后分配它。可以使用 lateinit 声明它,但是当我尝试像这样分配它时:
var welcomeFragment = Fragment.instantiate(this@MainActivity,
WelcomeFragment::class.java!!.getName())
我收到“类型不匹配 - 必需:片段,找到:WelcomeFragment!” 另外,如果我尝试这样做:
addFragment(WelcomeFragment, welcome)
Android Studio 抱怨 WelcomeFragment '(现在只是空的,除了一个 TextView 说“欢迎”)没有伴随对象。我试图做一个,但我真的不明白它必须做什么。阅读文档对我也没有帮助。
所以我的问题是:我如何正确地进行实例化,或者当我的大部分片段都只是一个实例时,我是否必须这样做。我可以通过在我的片段中正确添加伴随对象来避免这种情况吗?看起来怎么样?
对此的任何帮助、对我在这里的误解的暗示或指出的一般愚蠢将不胜感激!
【问题讨论】:
-
我现在花了一段时间习惯了 Kotlin,我想当我问这个问题时我只是不明白如何正确地做这些事情。所以现在我认为这不是一个有用的问题。
标签: android android-fragments kotlin