为什么原因:java.lang.IllegalStateException:surface_view不能为null?

时间:2019-03-08 16:17:40

标签: android-fragments android-activity kotlin

我正在我的应用中尝试this qeReader lib。我有一个活动,我在其中嵌入了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()

以及在我的活动布局中:

<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:我读到我不再需要Kotlin中的那些findViewById()东西了吗?尽管在FragmentTransaction中替换了surface_view,但为什么活动中的surface_view为空?

1 个答案:

答案 0 :(得分:1)

Q1:R是对“构建”应用程序时生成的资源集的引用。第一次将不存在,然后它将再次存在。每次您“清理”应用程序时,都会重置此设置。按“重建”将首先运行清理,然后进行构建。尽管这是Android资源系统的设计方式,但是Android Studio检查还不够聪明,无法在第一轮就知道这一点,因此它错误地认为您会遇到编译时错误。如果这种情况仍然存在,请尝试使Android Studio中的缓存无效,进行gradle同步,然后重新构建项目。

第二季度:Kotlin Android Extensions plugin是最近几年推出的一项功能,它避免了使用findViewById(...)来访问视图和窗口小部件。您只能访问使用setContentView(layout_xml_file)的Kotlin文件中的xml文件中声明的视图和窗口小部件。