所以我有来自公共API的数据的回收站视图。我仅具有用于FrameLayout的activity_main.xml,具有recyclerView的fragment_main.xml,以及用于recycler视图的用户行的user_row.xml。当我启动应用程序时,它甚至没有加载并关闭,并显示错误消息:
“ java.lang.NullPointerException:尝试在空对象引用” 上调用虚拟方法'void android.widget.Button.setOnClickListener(android.view.View $ OnClickListener)'
这是MainActivity。它仅用于片段调用
class MainActivity : AppCompatActivity(), BlankFragment.OnFragmentInteractionListener {
lateinit var blankFragment: BlankFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
blankFragment = BlankFragment.newInstance()
supportFragmentManager
.beginTransaction()
.add(R.id.fragmentContainer,blankFragment)
.addToBackStack(blankFragment.toString())
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit()
}
如您所见,错误是由按钮单击引起的。该按钮用于调用另一个片段
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
detailBtn.setOnClickListener {
detailFragment = DetailFragment.newInstance(idTV.text.toString().toInt())
fragmentManager!!.beginTransaction()
.replace(R.id.fragmentContainer, detailFragment)
.addToBackStack(BlankFragment.toString())
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit()
}
我尝试做
val btn: Button = detailBtn!!
但错误更改为NullPointerException
可能是因为 detailBtn 位于另一种布局中,但是我不确定,我也不知道该如何解决。
这是main_activity.xml布局
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/fragmentContainer"
android:layout_height="match_parent">
</FrameLayout>
这是fragment_main.xml的布局
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
这是带有按钮和 idTextView(idTV)
的user_row布局<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:onClick="itemClicked"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:layout_marginLeft="16dp"
android:id="@+id/idTV"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@+id/usernameTV"
tools:text="ID"
android:textSize="25sp"
android:textColor="#D32F2F"
android:padding="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_marginLeft="16dp"
android:id="@+id/usernameTV"
app:layout_constraintStart_toEndOf="@+id/idTV"
app:layout_constraintTop_toTopOf="parent"
tools:text="Userame"
android:textSize="25sp"
android:textColor="#000"
android:padding="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="+"
android:textSize="35sp"
android:layout_marginRight="16dp"
android:id="@+id/detailBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#E91E63"/>
<View
app:layout_constraintTop_toBottomOf="@id/usernameTV"
android:layout_width="match_parent"
android:layout_height="3px"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="#000"/>
</android.support.constraint.ConstraintLayout>
答案 0 :(得分:0)
在提出问题之前,请添加完整的代码。我很想知道您在片段中进行了findViewById(R.id.buttonId)
呼叫的位置。如果忘记在视图上调用NullPointerException
,则findViewById
通常会出现在代码中。如果您进行了findViewById调用,也会发生这种情况,但是您尝试查找的视图位于不同的布局/视图层次结构中。如果您发布完整的代码,我将为您提供帮助。(到目前为止,我还没有评论权限)
答案 1 :(得分:0)
您的detailBtn
是RecyclerView
单元格的一部分。因此,它尚未附加到视图层次结构中,甚至可能在视图层次结构中也不唯一。
您必须使用OnClickListener
将信息传递给片段来定义RecyclerView.Adapter
。
adapter.setOnClickListener { idTV ->
detailFragment = DetailFragment.newInstance(idTV.text.toString().toInt())
fragmentManager!!.beginTransaction()
.replace(R.id.fragmentContainer, detailFragment)
.addToBackStack(BlankFragment.toString())
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit()
}
class Adapter : RecyclerView.Adapter() {
private lateinit var listener: (TextView) -> Unit
fun setOnClickListener(listener: (TextView) -> Unit) {
this.listener = listener
}
override fun onCreateViewHolder(parent: ViewGroup, type: Int): ViewHolder {
val viewHolder = ...
viewHolder.itemView.run {
detailBtn.setOnClickListener {
listener(idTV)
}
}
return viewHolder
}
}