Ошибка надувания фрагмента класса 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)
    ...
}
Другие вопросы по тегам