Olaf-06
@Olaf-06
Студент

Почему, когда я, используя kotlin-android-extension, обращаюсь к view по его имени, мне выбрасывает null значение?

Используя kotlin-android-extensions, я обратился по имени к view и пытался использовать её метод, однако у меня выбило nullPointerException. Хотя мне сам ide подсказывала, что есть такая вот конкретная вьюха myCalendar в таком-то xml файле. Также, хочу отметить, пробовал стандартным способом дать переменной ссылку через findViewById, потом опять же использовать метод вьюхи, в таком случае всё работало.

p.s. вы наверное спросите: "почему я раньше не ловил null?", ибо я ещё до этого пытался обратиться к myCalendar, то я вам незамедлительно отвечу: у меня массив был нулевого размера, цикл не запускался.

import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.applandeo.materialcalendarview.EventDay
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.firestore.QueryDocumentSnapshot
import kotlinx.android.synthetic.main.fragment_timetable.*
import java.util.*
import kotlin.collections.ArrayList
import com.example.simbirsoftproject.Data as MyData

class MyEventDay(day: Calendar, imageResource: Int, var data: MyData) : EventDay(day, imageResource)

class FragmentTimetable : Fragment() {

    private var events: MutableList<EventDay> = ArrayList()
    val db: FirebaseFirestore = FirebaseFirestore.getInstance()
    private val dataOfLessons: MutableList<MyData> = getData()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        val view: View = inflater.inflate(R.layout.fragment_timetable, container, false)
        for (data: MyData in dataOfLessons) {
            Toast.makeText(
                context,
                data.getDay() + "." + data.getMonth() + "." + data.getYear(),
                Toast.LENGTH_SHORT
            ).show()
            val calendar: Calendar = Calendar.getInstance()
            calendar.set(data.getDay() as Int, data.getMonth() as Int, data.getYear() as Int)
            myCalendar.setDate(calendar)
            events.add(EventDay(calendar, R.drawable.fui_ic_googleg_color_24dp))
        }
        myCalendar.setEvents(events) //здесь я ловлю маслину (null)

        return view
    }

    fun getData(): MutableList<com.example.simbirsoftproject.Data> {
        val dataOfLessons: MutableList<MyData> = ArrayList()

        db.collection("GroupLessons")
            .get()
            .addOnCompleteListener { p0 ->
                for (document: QueryDocumentSnapshot in p0.result!!) {
                    Log.d("logmy", "В цикле1")
                    val dataClass: MyData = document.toObject(MyData::class.java)
                    Log.d("logmy", "В цикле2")
                    dataOfLessons.add(
                        MyData(
                            dataClass.getName(),
                            dataClass.getDescription(),
                            dataClass.getPhotoID(),
                            dataClass.getStartTime(),
                            dataClass.getEndTime(),
                            dataClass.getDay(),
                            dataClass.getMonth(),
                            dataClass.getYear()
                        )
                    )
                    Log.d("logmy", "В цикле3")
                }
            }

        return dataOfLessons
    }
}
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Ну в общем, чтобы использовать магию, надо знать, как она работает.
Почитай это, например.
Эти проперти - синтетические, их на самом деле нет. Их компилятор заменяет на обращение к кешу вьюх. А наполнить их он должен м помощью findViewById. Но ты ещё не вернул вьюху из метода onCreateView, никто не может догадаться, где вызывать find.
Резюме. Используй синтетические проперти в методе onViewCreated. А лучше не используй вообще, ну её нафиг, эту магию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы