Intereting Posts
Найти свойства с нулевым значением через отражение Robolectric test и LiveData Сохранить / Восстановить состояние NestedScrollView с несколькими RecyclerViews и другими видами Неопределенность разрешения перегрузки по числу лямбда-параметров IntelliJ autocompletion для включенных файлов сценариев графа kotlin kotlin, которая может использовать соединение httpS без проверки сертификата (например, curl – insecure) Как получить класс Any val Автоматический приращение документа Firestore из спискаView Котлин объясняет мне, что касается полей подкачки Ошибка: Содержит незаконное финальное поле – Котлин Android. Супертипы следующих классов не могут быть решены. ((Хранилище номеров, Библиотека Android) Внедрение в Kotlin – метод Значение по умолчанию Android: Дождитесь завершения нескольких задач Geofence не работает в Котлине Как определить свойство типа класса с помощью get () в Котлине

Почему настройка 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. Я думаю, что одно из преимуществ языка и прогресс каркаса делают некоторые библиотеки устаревшими или ненужными.