Ошибка надувания фрагмента класса android kotlin
Итак, во-первых, я отвечаю на ваш вопрос: "Вы действительно? Есть много ответов на него". Да, я знаю, но я действительно пытаюсь решить эту проблему, как третий день: во всех SOF нет вопросов по моей ошибке. У меня есть 2 аналогичных проекта: на Java и в Kotlin. Но эта ошибка @ @ ^%!@ Ing только в Котлине. Но XML на 100% идентичен.
Итак, ошибка: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
,
Моя деятельность_основная.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/layoutMain"
android:orientation="vertical">
<fragment
android:id="@+id/top_fragment"
android:name="com.example.weatherapp_kotlin.fragments.TopFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
</fragment>
<fragment
android:id="@+id/bottom_fragment"
android:name = "com.example.weatherapp_kotlin.fragments.BottomFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="4">
</fragment>
</LinearLayout>
Что я пытался сделать:
- Изменить
android:name =""
в XML дляclass = ""
- Установить
android:name
или жеclass
на первой позиции - Изменить
LinearLayout
вRelativeLayout
а такжеConstraintLayout
- Поменять класс
extends
вFragmentActivity
(сейчасFragment
а на яве все отлично работает) - Очистить проект
мой LinearLayout
имеет id
, orientation
, Путь к занятиям в android:name
это правда.
Я пытаюсь использовать фрагменты этого класса:
class StartActivity: Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}}
Может быть, это жесткий код, но в Java он работает нормально. Я думаю, что мне не нужно показывать TopFragment.kt
а также BottomFragment.kt
потому что я пытался рассказать вам все, что я нашел в темах SOF. Но если вам нужно - я покажу. Тем не менее, ошибка в XML-файле, поэтому, вероятно, XML является причиной.
Полная трассировка стека:
06-14 15:24:10.161 25861-25861/com.example.weatherapp_kotlin E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.weatherapp_kotlin, PID: 25861
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.weatherapp_kotlin/com.example.weatherapp_kotlin.StartActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2472)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2534)
at android.app.ActivityThread.access$800(ActivityThread.java:174)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5550)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)
Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:418)
at android.app.Activity.setContentView(Activity.java:2172)
at com.example.weatherapp_kotlin.StartActivity.onCreate(StartActivity.kt:9)
at android.app.Activity.performCreate(Activity.java:6003)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2425)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2534)
at android.app.ActivityThread.access$800(ActivityThread.java:174)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5550)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
at com.example.weatherapp_kotlin.fragments.TopFragment.onCreateView(TopFragment.kt:0)
at android.app.Fragment.performCreateView(Fragment.java:2069)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:875)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1050)
at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1152)
at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2142)
at android.app.Activity.onCreateView(Activity.java:5347)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:418)
at android.app.Activity.setContentView(Activity.java:2172)
at com.example.weatherapp_kotlin.StartActivity.onCreate(StartActivity.kt:9)
at android.app.Activity.performCreate(Activity.java:6003)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2425)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2534)
at android.app.ActivityThread.access$800(ActivityThread.java:174)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5550)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)
TopFragment.class:
class TopFragment : Fragment(), SwipeRefreshLayout.OnRefreshListener {
private var outputCity: String = getString(R.string.output_city)
private var outputClouds: String = getString(R.string.output_clouds)
private var outputHumidity: String = getString(R.string.output_humidity)
private var outputPressure: String = getString(R.string.output_pressure)
private var outputWindspeed: String = getString(R.string.output_windspeed)
private var outputMmhg: String = getString(R.string.output_mmHg)
private var outputMs: String = getString(R.string.output_ms)
private var date: Date = Date()
private var dateFormat: SimpleDateFormat = SimpleDateFormat("E, dd.MM")
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle): View? {
return inflater.inflate(R.layout.fragment_top, container, false)
}
override fun onStart() {
super.onStart()
swipeToRefresh.setOnRefreshListener(this)
swipeToRefresh.setColorSchemeColors(Color.GREEN, Color.RED, Color.BLUE, Color.CYAN)
checkInternetConnection(activity)
}
override fun onRefresh() {
Handler().postDelayed({
getData(activity)
swipeToRefresh.setRefreshing(false)
}, 2500)
}
fun checkInternetConnection(c: Context) {
if (InternetConnection().isNetworkAvailable(activity)) {
getData(activity)
} else {
Toast.makeText(activity, "Internet Connection Error", Toast.LENGTH_LONG).show()
}
}
fun getData(c: Context) {
val apiServiceWeather = RetrofitClient().getApiServiceWeather()
val call: Call<WeatherModel> = apiServiceWeather.getMyJSON();
call.enqueue(object: Callback<WeatherModel> {
override fun onResponse(call: Call<WeatherModel>?, response: Response<WeatherModel>?) {
val humidity: Int? = response!!.body().getMainWeather().humidity
val pressure: Float? = response.body().getMainWeather().pressure
val temperature: Float? = response.body().getMainWeather().temp
val windspeed: Float? = response.body().getWind().windspeed
val clouds: Int? = response.body().getClouds().clouds
textViewDate.setText((dateFormat!!.format(date).toString()))
textViewCity.setText(outputCity)
textViewTemp.setText(((Math.rint(temperature!! - 273.15) * 10.0) / 10.0).toString()
+ "°C")
textViewCondition.setText(response.body().getWeather().get(0).description)
textViewClouds.setText(outputClouds + " " + clouds.toString() + "%")
textViewPressure.setText(outputPressure + " " + (Math.round(pressure!! / 1.3332239))
.toString() + " " + outputMmhg)
textViewHumidity.setText(outputHumidity + " " + humidity.toString() + "%")
textViewWindspeed.setText(outputWindspeed + " " + windspeed.toString() + outputMs)
}
override fun onFailure(call: Call<WeatherModel>?, t: Throwable?) {
Toast.makeText(activity, "onResponse Error", Toast.LENGTH_LONG).show()
}
})
}
}
1 ответ
Вызывается: java.lang.IllegalStateException: фрагмент TopFragment{37d52abb} не присоединен к действию
...
на com.example.weatherapp_kotlin.fragments.TopFragment.(TopFragment.kt:24)
Я ожидаю, что это будет первая строка из частных варов, где вы звоните getString()
чтобы получить строку из ресурсов.
Эти поля инициализируются при создании объекта, но в данный момент фрагмент не привязан ни к какому контексту. getString()
нужны объекты ресурсов, которые приходят из контекста.
Этот сбой также произойдет, если вы просто создадите экземпляр (то есть вызовете его конструктор).
Причина, по которой он содержит исключение inflate, заключается в том, что эти фрагменты создаются при разборе макета xml. Он находит инструкцию для создания и включения фрагмента, но делает это неуспешно.
Возможные решения
1) Оберните вызовы getString в lazy
делегировать. Это приведет к задержке вызова при первом доступе к свойству, поэтому вам просто нужно убедиться, что вы обращаетесь к этим свойствам только тогда, когда уверены, что фрагмент прикреплен. Например, внутри onCreateView ().
private var outputCity by lazy { getString(R.string.output_city) }
2) Пометьте переменные с помощью lateinit
и инициализировать при первом подключении к контексту. Теперь вам нужно убедиться, что вы никогда не обращались к свойствам до этого, иначе вас встретят PropertyNotInitialisedException
,
private lateinit var outputCity: String
override fun onAttach(context: Activity) {
super.onAttach(context)
outputCity = getString(R.string.output_city)
...
}