java.lang.IllegalStateException: subscribeText must not be null
Ситуация следующая, мне нужно от гугла получать информацию о ценах подписки в разных регионах, это я делаю, callback'ом получаю цену в фрагменте и вывожу на экран. Но в метрике у некоторых пользователей вылетает ошибка
java.lang.IllegalStateException: subscribeText must not be null
at .Fragments.AdsFragment$a.e(Unknown Source)
at .Utils.d$b.a(Unknown Source)
at com.android.billingclient.api.g0.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6311)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
Мой фрагмент выглядит так:
class SubscribeFragment : Fragment(), SubscribePriceCallback {
private var subscribeResourceText: String = ""
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedState: Bundle?): View? {
ProviderSubscription.getSubscriptionPrice(this)
val view = inflater.inflate(R.layout.subscribe_fragment, container, false)
subscribeResourceText = getString(R.string.subscribe_text)
return view
}
@SuppressLint("SetTextI18n")
override fun subscribeMonthPrice(price: String) {
subscribeText!!.text = subscribeResourceText + price
}
}
Мой вопрос в следующем, из-за того что я вывожу текст не в onCreateView(), может нужно его по другому инициализировать например так:
class SubscribeFragment : Fragment(), SubscribePriceCallback {
private var subscribeText: TextView? = null
private var subscribeResourceText: String = ""
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedState: Bundle?): View? {
ProviderSubscription.getSubscriptionPrice(this)
val view = inflater.inflate(R.layout.subscribe_fragment, container, false)
subscribeResourceText = getString(R.string.subscribe_text)
subscribeText = view.findViewById(R.id.subscribeText)
return view
}
@SuppressLint("SetTextI18n")
override fun subscribeMonthPrice(price: String) {
subscribeText!!.text = subscribeResourceText + price
}
}
Или это происходит из-за того что price прилетает null, хотя в таком случае если я правильно понимаю TextView все равно должен просто выводить строку из string.xml. Так как у мне не удалось повторить ошибку, я не знаю может ли это быть связанно именно с возвращаемой ценной, если так подскажите пожалуйста почему может прилетать null?
Ответы (1 шт):
Инициализация текстового поля может происходить так:
lateinit var subscribeText: TextView
дальше в onCreateView():
subscribeText = view.findViewById(R.id.subscribeText)
Во вторых получение информации и сеттинг ее в виджет нужно проводить уже после присваивания значения переменной виджета. Мне почему-то кажется что эта строка:
ProviderSubscription.getSubscriptionPrice(this)
сетит текст в ваш виджет. Переместите ее после присваивания значения и все должно заработать нормально. Просто вы пытаетесь установить текст в переменную у которой нет значения, поэтому и падает на null. Так же как вариант можно использовать syntetics (пример):
import kotlinx.android.synthetic.main.activity_main.*
и дальше просто сетите текст:
subscribeText.text = "..."
Вот есть хороший туториал по работе с textView