Почему настройка onClickListener работает один раз?

Я хочу перенести очень прочную структуру проекта, которую я использую в Котлин. Сначала я попробовал основы: операции и фрагменты. Это выглядит так просто и просто:

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 содержит две кнопки. Все работает так, как ожидалось, первый щелчок на одном из них приводит меня к нужному фрагменту. Однако, как только я нажимаю кнопку «Назад», и снова вижу две кнопки, их прослушиватель кликов исчез. Это в значительной степени стандартный способ воплощения вещей, переведенных в Котлин, ничего необычного, кроме его замечательных новых функций. Я попытался переместить настройку onClickListeners в onCreateView() но он onCreateView() :

Причина: kotlin.KotlinNullPointerException at kotterknife.ButterKnifeKt $ viewFinder $ 7.invoke (ButterKnife.kt: 95) at kotterknife.ButterKnifeKt $ viewFinder $ 7.invoke (ButterKnife.kt) at kotterknife.ButterKnifeKt $ required $ 1.invoke (ButterKnife.kt: 104) на kotterknife.ButterKnifeKt $ требуется $ 1.invoke (ButterKnife.kt) на kotterknife.Lazy.getValue (ButterKnife.kt: 125)

Таким образом, несмотря на то, что Котлин был таким классным, у меня проблемы с основами, и я унываю, чтобы мигрировать. Неужели я действительно делаю так неправильно? Или почему установка простого прослушивателя кликов настолько расстраивает?

Спасибо.

Solutions Collecting From Web of "Почему настройка onClickListener работает один раз?"

Вы должны установить переменные, связанные с ButterKnife как lateinit var вместо val . Пытаться

 @BindView(R.id.btn_sale) lateinit var title: Button @BindView(R.id.btn_visit) lateinit var title: Button 

Решение: решила его, избавив KotterKnife и ButterKnife и используя ButterKnife Android. Я думаю, что одно из преимуществ языка и прогресс каркаса делают некоторые библиотеки устаревшими или ненужными.