Ошибка раздувания фрагмента класса android kotlin

Итак, во-первых, я отвечаю на ваш вопрос: «Вы действительно? На это много ответов». Да, я знаю, но я действительно пытаюсь решить эту проблему как третий день: во всех SOF нет никаких сомнений в моей ошибке. У меня есть два похожих проекта: на Java и в Котлине. Но это ошибка f @ # ^%! @ Только в Котлине. Но XML идентичен 100%.

Итак, ошибка: android.view.InflateException: Binary XML file line #8: Error inflating class fragment .

Моя активность_main.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 а в Java он отлично работает)
  • Очистить проект

У моего LinearLayout есть id , orientation . Путь к классам в android:name – true.

Я пытаюсь использовать фрагменты этого класса:

 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() } }) } 

}

Вызывается: java.lang.IllegalStateException: Фрагмент TopFragment {37d52abb} не привязан к действию

at com.example.weatherapp_kotlin.fragments.TopFragment. (TopFragment.kt: 24)

Я ожидаю, что это будет первая строка частных vars, где вы вызываете getString() чтобы получить строку из ресурсов.

Эти поля инициализируются во время построения объекта, но в это время фрагмент не привязан к какому-либо контексту. getString() нуждается в ресурсных объектах, которые поступают из контекста.
Этот сбой произойдет также, если вы просто создадите экземпляр самостоятельно (т. Е. Назовите его конструктором).

Причина, по которой его обернуто исключение раздувания, заключается в том, что эти фрагменты создаются при анализе макета 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) ... } 
Давайте будем гением компьютера.