Я пытаюсь передать событие щелчка для представления в Fragment
на Activity
. Я следовал руководству по документации от здесь . Насколько я понимаю, я могу ошибаться, но нам нужно создать интерфейс, добавить к нему объявление метода и вызвать метод с момента получения события click для фрагмента. Затем Activity должен реализовать интерфейс, определенный во фрагменте, так что Activity получает это событие.
У меня есть мой фрагмент:
class MoreFragment : Fragment() {
internal var callback: OnMoreItemClickedListener
fun setOnMoreItemClickedListener(callback: OnMoreItemClickedListener) {
this.callback = callback
}
interface OnMoreItemClickedListener {
fun onAddClothClicked()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_more, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
}
override fun onStart() {
super.onStart()
btn_add_clothes.setOnClickListener {
callback.onAddClothClicked()
}
}
}
И у меня есть Activity:
class MainActivity : AppCompatActivity(), MoreFragment.OnMoreItemClickedListener {
override fun onAddClothClicked() {
Log.d("MainActivity", "HERE")
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
val appBarConfiguration = AppBarConfiguration(
setOf(
R.id.navigation_clothes,
R.id.navigation_seasons,
R.id.navigation_notifications,
R.id.navigation_more
)
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
}
override fun onAttachFragment(fragment: Fragment) {
super.onAttachFragment(fragment)
if(fragment is MoreFragment){
fragment.setOnMoreItemClickedListener(this)
}
}
}
Теперь я получаю сообщение об ошибке:
MoreFragment.kt: (16, 5): Property must be initialized or be abstract
MoreFragment.kt: (16, 5)
равно internal var callback: OnMoreItemClickedListener
. Ссылка на документацию выше предлагает такой же / похожий код, но он не работает.
Вещи, которые я пробовал
- Я пытался поместить туда
lateinit var
для переменной callback: OnMoreItemClickedListener
, но не повезло. Поскольку он никогда не инициализируется. - Я поставил
internal var callback: OnMoreItemClickedListener? = null
и сослался на callback
, используя нулевой безопасный оператор ?.
, но не смог получить событие щелчка.
IЯ довольно новичок в Kotlin и Fragments, поэтому, пожалуйста, помогите мне понять, как это сделать. Спасибо