为什么设置onClickListener一次工作?
我想把一个非常坚实的项目结构迁移到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的标准方式,除了它的很酷的新function之外,没有什么特别的。 我试着将onClickListeners设置为onCreateView()
但是它崩溃了:
由于:kotlin.KotlinNullPointerException在kotterknife.ButterKnifeKt $ viewFinder $ 7.invoke(ButterKnife.kt:95)在kotterknife.ButterKnifeKt $ viewFinder $ 7.invoke(ButterKnife.kt)在kotterknife.ButterKnifeKt $需要$ 1.invoke(ButterKnife.kt: 104)在kotterknife.ButterKnifeKt $需要$ 1.invoke(ButterKnife.kt)在kotterknife.Lazy.getValue(ButterKnife.kt:125)
所以,尽管Kotlin非常酷,但我在做基础知识时遇到了麻烦,而且我感到很沮丧。 我真的做错了吗? 或者如何设置一个简单的点击监听器是如此令人沮丧?
谢谢。
你必须把你的variables绑定到ButterKnife作为lateinit var
而不是val
。 尝试
@BindView(R.id.btn_sale) lateinit var title: Button @BindView(R.id.btn_visit) lateinit var title: Button
解决方案:通过摆脱KotterKnife
和ButterKnife
并使用android的findViewById
解决它。 我猜这个语言的好处之一就是框架的进步会使一些库过时或者不必要。
- Android Room TypeConverters无法识别
- Android getAllNetworkInfo()已弃用。 有什么选择?
- 我如何解决android.os.NetworkOnMainThreadException?
- 如何解决找不到android.arch.lifecycle:编译器?
- RecyclerView项目动画,onAnimationFinished调用,但不是onAnimationStarted。 为什么?
- 使用Android SDK发布多部分请求
- Kotlin Gson自定义解串器列表
- 使用Retrofit2 + RxJava + Jackson重试202状态码
- Gradle构建失败,新的Gradle 3.0.0