Есть ли способ написать setOnClickListener для кнопки во фрагменте? - PullRequest
0 голосов
/ 28 января 2019

Я пишу 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
}
}

Вот мой код активности_100 *

Не могу понять, что я здесь не так делаю

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Если вы не используете плагин kotlin для расширений Android , вам нужно будет найти кнопку, используя что-то вроде.

btnAdd = view.findViewById(R.id.btnAdd) as Button

, прежде чем вызывать метод setOnClickListener

То же самое относится к любому другому элементу представления, определенному в XML.

0 голосов
/ 28 января 2019

Ваша кнопка является частью завышенного вида.

Чтобы получить его, вам нужно использовать его в пределах своего вида, как показано ниже:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...