Передайте событие щелчка на представлении в фрагменте в действие - PullRequest
0 голосов
/ 02 октября 2019

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

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

В методе переопределения фрагмента onAttach

private lateinit var callback: OnMoreItemClickedListener

    override onAttach(context : Context){
    callback  = context as OnMoreItemClickedListener
    }

, тогда ваш обратный вызов будет init. так как onAttach будет первым. поэтому никакое свойство не должно быть инициализировано, иначе возникнет абстрактная ошибка.

также в Activity реализует ваш интерфейс (OnMoreItemClickedListener) и переопределяет его метод. Вы получите обратный звонок

0 голосов
/ 02 октября 2019

Вы оба в порядке, все в порядке.

Я попытался поместить переменную lateinit для обратного вызова:

Я поставил внутренний вызов var: OnMoreItemClickedListener? = null

Я полагаю, что проблема здесь просто отладить код ниже. это происходит внутри if

if(fragment is MoreFragment){
  fragment.setOnMoreItemClickedListener(this)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...