Есть ли способ написать 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.

Другие вопросы по тегам