Getting Error inflating class fragment error while using view binding in fragments

问题描述 投票:0回答:1

由于 Kotlin 1.8 强制视图绑定,所以我在主要活动和片段中实现了它。但是我在夸大类片段时遇到错误

这里是主要活动课。我认为由于视图绑定,在膨胀主布局时存在错误。我已经初始化了 navContoller,它在 home fragment 中添加代码之前工作正常

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var navController: NavController
    private lateinit var appBarConfiguration: AppBarConfiguration
    lateinit var viewModel: MandirViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val mandirRep = (application as MandirApplication).repository

        val viewModelFactory = MandirViewModelFactory(mandirRep)
        viewModel = ViewModelProvider(this , viewModelFactory).get(MandirViewModel::class.java)

        navController = findNavController(R.id.navContainer)
        appBarConfiguration = AppBarConfiguration(setOf(R.id.homeFragment , R.id.notificationsFragment , R.id.favouriteFragment , R.id.settingsFragment))
        setupActionBarWithNavController(navController , appBarConfiguration)
        binding.bottomNavigationView.setupWithNavController(navController)
 

} }

这里是调用 API 调用存储库的主页片段。我认为这里的错误是夸大了布局。可能是因为viewbinding

  class HomeFragment : Fragment() {

    private lateinit var mandirViewModel: MandirViewModel
    private lateinit var mandirAdapter: MandirAdapter
    private lateinit var binding: FragmentHomeBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
         binding = FragmentHomeBinding.inflate(inflater , container , false)

        mandirViewModel = (activity as MainActivity).viewModel
        mandirAdapter = MandirAdapter()

        binding!!.rvMandir.apply {
            adapter = mandirAdapter
            layoutManager = LinearLayoutManager(context)
        }


        mandirViewModel.mAndirs.observe( viewLifecycleOwner , Observer {
            it.let { response->
                mandirAdapter.differ.submitList(response.data)

            }

        })

        return view
    }

}

这是应用类。我已经使用它来使用 Retrofit 类的实例初始化存储库

class MandirApplication : Application() {

    lateinit var repository: MandirRepository

    override fun onCreate() {
        super.onCreate()

        initialize()
    }

    private fun initialize() {

        val mandirService = RetrofitHelper.getInstance().create(MandirAPI::class.java)
        repository = MandirRepository( mandirService , applicationContext)
    }
}

这里是主要活动的 XML 文件。我使用了框架布局,因为我在这里读到片段视图需要框架布局才能跨片段移动

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.MainActivity">

        <fragment
            android:id="@+id/navContainer"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:defaultNavHost="true"
            app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:navGraph="@navigation/navgraph" />


    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigationView"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_gravity="bottom"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.997"
        app:menu="@menu/menu" />

</FrameLayout>

这里是 home Fragment 的 XML 文件。在主页片段中膨胀此布局是一个错误

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.HomeFragment">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rvMandir"/>

</FrameLayout>

这是错误日志。不知道是不是显示 viewModel 未初始化。它还显示了膨胀布局中的问题 请帮助

2023-05-03 15:38:17.103 1931-1931 AndroidRuntime com.example.mandirapp E 致命异常:main

    Process: com.example.mandirapp, PID: 1931
                                                                                                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mandirapp/com.example.mandirapp.ui.MainActivity}: android.view.InflateException: Binary XML file line #19 in com.example.mandirapp:layout/activity_main: Binary XML file line #19 in com.example.mandirapp:layout/activity_main: Error inflating class fragment
                                                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
                                                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
                                                                                                        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
                                                                                                        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
                                                                                                        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                        at android.os.Looper.loop(Looper.java:288)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7839)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
                                                                                                    Caused by: android.view.InflateException: Binary XML file line #19 in com.example.mandirapp:layout/activity_main: Binary XML file line #19 in com.example.mandirapp:layout/activity_main: Error inflating class fragment
                                                                                                    Caused by: android.view.InflateException: Binary XML file line #19 in com.example.mandirapp:layout/activity_main: Error inflating class fragment
                                                                                                    Caused by: kotlin.UninitializedPropertyAccessException: lateinit property viewModel has not been initialized
                                                                                                        at com.example.mandirapp.ui.MainActivity.getViewModel(MainActivity.kt:25)
                                                                                                        at com.example.mandirapp.ui.HomeFragment.onCreateView(HomeFragment.kt:34)
                                                                                                        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:3104)
                                                                                                        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:524)
                                                                                                        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
                                                                                                        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
                                                                                                        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1433)
                                                                                                        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2977)
                                                                                                        at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2888)
                                                                                                        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3129)
                                                                                                        at androidx.fragment.app.FragmentStateManager.ensureInflatedView(FragmentStateManager.java:394)
                                                                                                        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:260)
                                                                                                        at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:142)
                                                                                                        at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:136)
                                                                                                        at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:248)
                                                                                                        at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:227)
                                                                                                        at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1073)
                                                                                                        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1001)
                                                                                                        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:965)
                                                                                                        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1127)
                                                                                                        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1088)
                                                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:686)
                                                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:538)
                                                                                                        at com.example.mandirapp.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:45)
                                                                                                        at com.example.mandirapp.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:39)
                                                                                                        at com.example.mandirapp.ui.MainActivity.onCreate(MainActivity.kt:30)
                                                                                                        at android.app.Activity.performCreate(Activity.java:8051)
2023-05-03 15:38:17.104  1931-1931  AndroidRuntime          com.example.mandirapp                E      at android.app.Activity.performCreate(Activity.java:8031)
                                                                                                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
                                                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
                                                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
                                                                                                        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
                                                                                                        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
                                                                                                        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                        at android.os.Looper.loop(Looper.java:288)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7839)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
android kotlin android-fragments mvvm android-viewbinding
1个回答
0
投票

发生这种情况是因为您必须在 onCreateView() 方法中返回膨胀的视图。在你的情况下是

binding.root
。像这样:

class HomeFragment : Fragment() {

  private lateinit var mandirViewModel: MandirViewModel
  private lateinit var mandirAdapter: MandirAdapter
  private lateinit var binding: FragmentHomeBinding

  override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
  ): View? {
    // Inflate the layout for this fragment
     binding = FragmentHomeBinding.inflate(inflater , container , false)

    mandirViewModel = (activity as MainActivity).viewModel
    mandirAdapter = MandirAdapter()

    binding!!.rvMandir.apply {
        adapter = mandirAdapter
        layoutManager = LinearLayoutManager(context)
    }


    mandirViewModel.mAndirs.observe( viewLifecycleOwner , Observer {
        it.let { response->
            mandirAdapter.differ.submitList(response.data)

        }

    })

    return binding.root
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.