我正在我的应用中尝试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为空?
答案 0 :(得分:1)
Q1:R是对“构建”应用程序时生成的资源集的引用。第一次将不存在,然后它将再次存在。每次您“清理”应用程序时,都会重置此设置。按“重建”将首先运行清理,然后进行构建。尽管这是Android资源系统的设计方式,但是Android Studio检查还不够聪明,无法在第一轮就知道这一点,因此它错误地认为您会遇到编译时错误。如果这种情况仍然存在,请尝试使Android Studio中的缓存无效,进行gradle同步,然后重新构建项目。
第二季度:Kotlin Android Extensions plugin是最近几年推出的一项功能,它避免了使用findViewById(...)
来访问视图和窗口小部件。您只能访问使用setContentView(layout_xml_file)
的Kotlin文件中的xml文件中声明的视图和窗口小部件。