为啥 findViewById 搜索 RecyclerView 时返回 null?
Posted
技术标签:
【中文标题】为啥 findViewById 搜索 RecyclerView 时返回 null?【英文标题】:Why does findViewById returning null when searching for the RecyclerView?为什么 findViewById 搜索 RecyclerView 时返回 null? 【发布时间】:2021-08-04 00:59:31 【问题描述】:为什么val rv: RecyclerView = findViewById(R.id.material_list_rv)
返回 null?
MainActivity
class MainActivity : AppCompatActivity()
var adaptor: MaterialListAdaptor = MaterialListAdaptor()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState == null)
supportFragmentManager.commit
setReorderingAllowed(true)
add<MaterialListFragment>(R.id.fragment_container_view)
initRecyclerView()
setRecyclerViewData()
private fun initRecyclerView()
val rv: RecyclerView = findViewById(R.id.material_list_rv)
rv.layoutManager = LinearLayoutManager(this@MainActivity)
rv.adapter = adaptor
private fun setRecyclerViewData()
val l = DataSource.createMaterialList()
adaptor.setDataSet(l)
activity_main
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container_view"
android:layout_
android:layout_ />
</androidx.constraintlayout.widget.ConstraintLayout>
MaterialListFragment
class MaterialListFragment : Fragment()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View
return inflater.inflate(R.layout.fragment_material_list, container, false)
fragment_material_list
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".MaterialListFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/material_list_rv"
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/material_list_rv_list_item" />
</androidx.constraintlayout.widget.ConstraintLayout>
【问题讨论】:
【参考方案1】:问题
您在MainActivity.onCreate
中拨打了findViewById
的电话。现在还为时过早,那时还没有创建 Fragment 的视图。
您应该在MaterialListFragment
中寻找视图。如果您在onCreateView
中调用findViewById
,它将起作用。像这样:
val root = inflater.inflate(R.layout.fragment_material_list, container, false)
val rv = root.findViewById(R.id. material_list_rv)
// Do whatever (eg assign rv to a field in the Fragment to use it later)
return root
一些建议
即使您的代码有效,也请尝试让活动、片段和自定义视图管理它们自己的子视图。
如果上面的容器深入到它们的子容器中,那么非常很容易出错(就像这里的那个!)并且你失去了在不破坏容器的情况下更新片段和视图的内部细节的能力活动。
Activity/Fragment 生命周期图表
要确定自己的方向,请记住这一点(尽管此图极度简化了):
【讨论】:
非常感谢。您的回答将我引至此链接developer.android.com/guide/fragments/communicate【参考方案2】:您正在 MainActivity 中寻找 RecylerView,但它并不存在。 相反,您应该尝试在 FragmentActivity 中访问它。
【讨论】:
以上是关于为啥 findViewById 搜索 RecyclerView 时返回 null?的主要内容,如果未能解决你的问题,请参考以下文章