【发布时间】:2017-11-13 16:25:08
【问题描述】:
我想将我使用的一个非常可靠的项目结构迁移到 Kotlin。我首先尝试了基础知识:活动和片段事务。它看起来如此简单:
class MainActivity : AppCompatActivity(), SomeInterface {
override fun onCreate(savedInstanceState: Bundle?) {
setContentView(R.layout.activity_main)
val mainFragment = supportFragmentManager.findFragmentById(R.id.fragment_main) as MainActionsFragment?
?: MainActionsFragment.newInstance()
supportFragmentManager.inTransaction {
add(R.id.container_main, mainFragment)
}
}
private val anotherFragment by lazy {
supportFragmentManager.findFragmentById(R.id.another_fragment) as AnotherFragment?
?: AnotherFragment.newInstance()
}
override fun myInterfaceMethod() {
replaceFragment(anotherFragment, R.id.container_main)
}
}
class MainActionsFragment : Fragment() {
val btnSale: Button by bindView(R.id.btn_sale)
val btnVisit: Button by bindView(R.id.btn_visit)
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater!!.inflate(R.layout.fragment_main, container, false)
}
override fun onResume() {
super.onResume()
btnSale.setOnClickListener{ _ ->
listener.requestAction(SaleType.SALE)
}
btnVisit.setOnClickListener{ _ ->
listener.requestAction(SaleType.VISIT)
}
}
}
Extensions.kt
fun AppCompatActivity.replaceFragment(fragment: Fragment, @IdRes frameId: Int) {
supportFragmentManager.inTransaction {
replace(frameId, fragment)
.addToBackStack(fragment.tag)
}
}
inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) {
beginTransaction()
.func()
.commit()
}
现在,MainActionsFragment 拥有两个按钮。一切都按预期工作,第一次单击任何一个都会将我带到所需的片段。但是,一旦我按下后退按钮并再次看到我的两个按钮,它们的点击监听器就消失了。这几乎是转换为 Kotlin 的标准做事方式,除了酷炫的新功能外,没有什么特别的。我尝试将 onClickListeners 设置为onCreateView(),但它崩溃了:
原因:kotlin.KotlinNullPointerException 在 kotterknife.ButterKnifeKt$viewFinder$7.invoke(ButterKnife.kt:95) 在 kotterknife.ButterKnifeKt$viewFinder$7.invoke(ButterKnife.kt) 在 kotterknife.ButterKnifeKt$required$1.invoke(ButterKnife.kt:104) 在 kotterknife.ButterKnifeKt$required$1.invoke(ButterKnife.kt) 在 kotterknife.Lazy.getValue(ButterKnife.kt:125)
因此,尽管 Kotlin 非常酷,但我在做基础知识时遇到了麻烦,而且我对迁移感到沮丧。我真的做错事了吗?或者为什么设置一个简单的点击监听器会如此令人沮丧?
谢谢。
【问题讨论】:
-
问题不在于 NPE。请再读一遍@Carcigenicate
标签: android android-fragments kotlin kotlin-android-extensions