Почему вызвано: java.lang.Исключение IllegalStateException: surface_view не должно быть null?

#android-fragments #android-activity #kotlin

#android-фрагменты #android-активность #kotlin

Вопрос:

Я тестирую эту библиотеку qeReader в своем приложении. У меня есть действие, в которое я встраиваю SurfaceFragment. Здесь макет fragment_surface:

 <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <SurfaceView
            android:id="@ id/surface_view"
            android:layout_width="300dp"
            android:layout_height="300dp"/>
</LinearLayout>
  

и мой SurfaceFragment :

     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_surface, container, false)
}
  

и в моей деятельности я вызываю:

 val fragmentManager = this.supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.framelayout_qr, SurfaceFragment())
fragmentTransaction.commit()
  

и в моем макете activities:

 <FrameLayout
        android:id="@ id/framelayout_qr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
/>
  

Позже мне нужно получить доступ из моей активности к surface_view, но это приводит к сбою:

Вызвано: java.lang.Исключение IllegalStateException: surface_view не должно быть нулевым

Q1: Все мои R отмечены красным цветом и помечены как неразрешенная ссылка: R , хотя они импортированы в код. Но я могу запускать приложение до сбоя. Почему он отмечен красным, но явно импортирован?

Q2: Я читал, что мне больше не нужны эти функции findViewById () в Kotlin? Почему surface_view равен нулю в activity, хотя он заменен во FragmentTransaction?

Ответ №1:

Q1: R — это ссылка на набор ресурсов, которые генерируются при «сборке» приложения. В первый раз он не будет существовать, затем в последующие разы он будет существовать. Это сбрасывается каждый раз, когда вы «очищаете» приложение. Нажатие «rebuild» сначала запустит очистку, затем сборку. Хотя так устроена система ресурсов Android, проверка Android Studio недостаточно умна, чтобы понять это с первого раза, поэтому она ошибочно считает, что вы получите ошибку во время компиляции. Если это не устраняется, попробуйте аннулировать кэши в Android Studio, выполнить синхронизацию gradle, а затем перестроить проект.

Q2: Плагин Kotlin Android Extensions — это функция, появившаяся за последние пару лет, которая позволяет избежать необходимости использования findViewById(...) для доступа к представлениям и виджетам. Вы можете получить доступ только к представлениям и виджетам, которые объявлены в xml-файле, из файла Kotlin, в котором вы используете setContentView(layout_xml_file) .