¿Por qué la configuration de OnClickListener funciona una vez?

Quiero migrar una estructura de proyecto muy sólida que uso para Kotlin. Primero probé lo básico: actividades y transactions de fragments. Parece tan fácil y simple:

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() } 

Ahora, MainActionsFragment tiene dos botones. Todo funciona como se esperaba, el primer clic en cualquiera de ellos me lleva al fragment deseado. Sin embargo, una vez que presiono el button Atrás y veo mis dos botones nuevamente, su oyente de clic se ha ido. Esta es más o less la forma estándar de hacer las cosas traducidas a Kotlin, nada extravagante además de sus nuevas características. Intenté mover la configuration de onClickListeners a onCreateView() pero se bloquea:

Causado por: kotlin.KotlinNullPointerException en kotterknife.ButterKnifeKt $ viewFinder $ 7.invoke (ButterKnife.kt: 95) en kotterknife.ButterKnifeKt $ viewFinder $ 7.invoke (ButterKnife.kt) en kotterknife.ButterKnifeKt $ requiere $ 1.invoke (ButterKnife.kt: 104) en kotterknife.ButterKnifeKt $ requirió $ 1.invoke (ButterKnife.kt) en kotterknife.Lazy.getValue (ButterKnife.kt: 125)

Entonces, a pesar de que Kotlin es tan genial, estoy teniendo problemas para hacer lo básico y me desanimo a migrar. ¿Realmente estoy haciendo las cosas mal? ¿O cómo puede ser tan frustrante configurar un simple clic?

Gracias.

Debe establecer las variables que están vinculadas por ButterKnife como lateinit var lugar de val . Tratar

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

Solución: lo resolvió al deshacerse de KotterKnife y ButterKnife y usar findViewById de findViewById . Supongo que una de las ventajas del lenguaje y el progreso del marco hace que algunas bibliotecas sean obsoletas o innecesarias.

  • Kotlin Objetos de carga demorada
  • Cómo pasar los valores de actividad a otra actividad en kotlin
  • Cómo inicializar widgets en Android usando kotlin
  • Android Kotlin: java.lang.NoClassDefFoundError: Resolución fallida de: <KotlinObject>
  • La anotación de ButterKnife @OnClick no funciona en el fragment de Kotlin
  • Kotlin Elimina todos los caracteres no alfanuméricos
  • Clase Kotlin no encontrada
  • Base de datos de android de Kotlin: no se puede convertir java.lang.String en android.database.Cursor
  • Cómo pasar object personalizado a través de bash en kotlin
  • Cómo lanzar Cadena en Int y Largo?
  • Problemas al intentar generar la aplicación Kotlin con Android Studio