Есть ли способ написать setOnClickListener для кнопки во фрагменте?
Я пишу setOnClickListener для Button in Fragment в Kotlin, но он не работает и говорит "NullPointerException" во Fragment, где btnAdd использовал строку.
class TODOFragment : Fragment() {
private var works = ArrayList<WorkData>()
override fun onCreateView(inflater: LayoutInflater, container:
ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.work_list, container, false)
view.work_list.layoutManager = LinearLayoutManager(context)
works = Database.database().getWorksByStatus(3)
val adapter = WorkAdapter(works)
view.work_list.adapter = adapter
btnAdd.setOnClickListener {
val dialog = AddProductDialog(context!!)
dialog.setOnClickListener { title, description ->
Database.database().addWork(title, description)
adapter.data.add(WorkData(title, description, Status.TODO))
}
dialog.show()
adapter.notifyItemInserted(works.size + 1)
work_list.layoutManager!!.scrollToPosition(adapter.itemCount)
}
return view
}
}
Вот моя активность
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="?actionBarSize">
</android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<ImageButton
android:id="@+id/btnAdd"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="bottom|right"
android:layout_margin="32dp"
android:background="@drawable/btn_circle_bgn"
android:src="@drawable/ic_add"
tools:ignore="RtlHardcoded" />
</FrameLayout>
Я не могу понять, что я делаю не так здесь
2 ответа
Ваша кнопка является частью завышенного представления.
Чтобы получить его, вам нужно использовать его в представлении, как показано ниже:
override fun onCreateView(inflater: LayoutInflater, container:
ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.work_list, container, false)
view.work_list.layoutManager = LinearLayoutManager(context)
works = Database.database().getWorksByStatus(3)
val adapter = WorkAdapter(works)
view.work_list.adapter = adapter
view.btnAdd.setOnClickListener {
val dialog = AddProductDialog(context!!)
dialog.setOnClickListener { title, description ->
Database.database().addWork(title, description)
adapter.data.add(WorkData(title, description, Status.TODO))
}
dialog.show()
adapter.notifyItemInserted(works.size + 1)
work_list.layoutManager!!.scrollToPosition(adapter.itemCount)
}
return view
}
Если вы не используете плагин kotlin android extensions, вам нужно будет найти кнопку, используя что-то вроде.
btnAdd = view.findViewById(R.id.btnAdd) as Button
перед вызовом setOnClickListener
метод
То же относится и к любому другому элементу представления, определенному в XML.