Как использовать Kotlin Android Extensions с Fragment
s? Если я использую их внутри onCreateView()
, я получаю это NullPointerException
исключение:
Вызывается: java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.view.View android.view.View.findViewById (int)' для ссылки на пустой объект
Вот фрагмент кода:
package com.obaied.testrun.Fragment
import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.obaied.acaan.R
import kotlinx.android.synthetic.main.fragment_card_selector.*
public class CardSelectorFragment : Fragment() {
val TAG = javaClass.canonicalName
companion object {
fun newInstance(): CardSelectorFragment {
return CardSelectorFragment()
}
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var rootView = inflater?.inflate(R.layout.fragment_card_selector, container, false)
btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
return rootView
}
}
`
rootView.btn_K.setOnClickListener
Ответы:
Синтетические свойства Kotlin не волшебны и работают очень просто. Когда вы получаете доступ
btn_K
, он требуетgetView().findViewById(R.id.btn_K)
.Проблема в том, что вы получаете к нему доступ слишком рано.
getView()
возвращаетсяnull
вonCreateView
. Попробуйте сделать это вonViewCreated
методе:источник
onViewCreated()
getView()
или не может вызватьfindViewById()
, есть ли способ обойти это? Например, научите его, какая функция вернет мой макет?rootView.btn_K
если бы у вас было представление (и не только по фрагментам, это можно сделать везде)Вы вызываете это
btn_K
слишком рано, так как в это время он возвращает ноль и дает вам исключение нулевого указателя.Вы можете использовать эти представления этим синтетическим плагином в
onActivityCreated()
методе, который вызывается сразу послеonCreateView()
жизненного цикла фрагмента.источник
onViewCreated
но затем определены вonActivityCreated
. Хотя не знаю почему.Синтетические свойства , порождаемые Котлин Android Extensions плагина нужно
view
для ,Fragment/Activity
чтобы установить , прежде чем руки.В вашем случае, для
Fragment
, вам нужно использоватьview.btn_K
вonViewCreated
Или лучше, вы должны получить доступ только к синтетическим свойствам в
onViewCreated
Обратите внимание, что
savedInstanceState
параметр должен иметь значение NULLBundle?
, а также установите флажок Импорт синтетических свойств.источник
единственное, что вам нужно сделать, это:
источник
val view = inflater.inflate() view.button.text = "caption"
.rootView.subView.doSomething
. Лучше использовать представления, начиная сonViewCreated
нет необходимости определять сопутствующий объект, просто вызовите каждый идентификатор с помощью вида
источник
Во фрагментах, пожалуйста, напишите свой код в onActivityCreated: -
источник
onViewCreated
вместо этого?В моем случае ничего не получалось, пока я не последовал совету Otziii в комментариях. Очистите, восстановите (перезагрузка не требуется), перезапустите приложение. Мне также не нужно было идти
onActivityCreated
и простоonCreateView
сделал свое дело.Однажды я также допустил ошибку, надувая неправильную компоновку, таким образом, очевидно, не получив ожидаемые элементы управления.
источник
onActivityCreated
тоже времяДобавляя его к ответу @Egor Neliuba, да, всякий раз, когда вы вызываете представление без ссылки, kotlinex ищет rootView, и поскольку вы находитесь внутри фрагмента, а у фрагмента нет
getView()
метода. Поэтому это может броситьNullPointerException
Есть два способа преодолеть это,
onViewCreated()
как упоминалосьИли, если вы хотите связать представления в каком-то другом классе (скажем, анонимном), вы можете просто создать функцию расширения, например:
fun View.bindViews(){...}
Второй подход полезен, когда у вас есть один фрагмент с множественным поведением.
источник
}
** Здесь вы используете btn_K.setOnClickListener перед поиском. Вы должны найти элемент xml в вашем коде java / kotlin, используя findViewById тогда и только тогда вы можете выполнять операции с этим представлением или элементом.
-Таким образом, вы получили исключение нулевого указателя
**
источник