为什么设置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 

解决方案:通过摆脱KotterKnifeButterKnife并使用android的findViewById解决它。 我猜这个语言的好处之一就是框架的进步会使一些库过时或者不必要。