Resources$NotFoundException - 无法打开文件“...fragment_list.xml”:没有这样的文件或目录

Bri*_*all 4 android android-jetpack

我正在学习 MVVM 并遇到了一个问题,我收到以下错误:

\n
Resources$NotFoundException: File res/layout/fragment_list.xml from xml type layout resource ID #0x7f0b002f\n
Run Code Online (Sandbox Code Playgroud)\n

\n
Failed to open file \'/data/data/software.genau.dogs/code_cache/.overlay/base.apk/res/layout/fragment_list.xml\': No such file or directory\n
Run Code Online (Sandbox Code Playgroud)\n

我知道该文件存在于我的布局中,并且没有为fragment_list.xml 文件列出任何错误或警告。在设计视图中,一切都按照我想要的方式布局,并且看起来正确。

\n

为了尝试解决这个问题,我尝试了一些基本的方法,例如清理项目和重建,并重新启动程序(和我的机器)。另外,我尝试了不同的方法来覆盖带或不带绑定的 fun onCreateView() 。

\n

我希望得到一些帮助。

\n

这是 MVVM 布局:\n来自 Android studio 文件夹布局的图片

\n

这是我的 ListFragment.kt 代码:

\n
package software.genau.dogs.view\n\n    import android.os.Bundle\n    import androidx.fragment.app.Fragment\n    import android.view.LayoutInflater\n    import android.view.View\n    import android.view.ViewGroup\n    import androidx.lifecycle.Observer\n    import androidx.lifecycle.ViewModelProviders\n    import androidx.navigation.Navigation\n    import androidx.recyclerview.widget.LinearLayoutManager\n    import software.genau.dogs.R\n    import software.genau.dogs.databinding.FragmentListBinding\n    import software.genau.dogs.viewmodel.ListViewModel\n    \n    class ListFragment : Fragment() {\n        private lateinit var binding: FragmentListBinding\n        private lateinit var viewModel: ListViewModel\n        private val dogsListAdapter = DogsListAdapter(arrayListOf())\n    \n    \n    \n        override fun onCreateView(\n            inflater: LayoutInflater,\n            container: ViewGroup?,\n            savedInstanceState: Bundle?\n        ): View? {\n            return inflater.inflate(R.layout.fragment_list, container, false)\n        }\n    \n        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n            super.onViewCreated(view, savedInstanceState)\n    \n            viewModel = ViewModelProviders.of(this).get(ListViewModel::class.java)\n            viewModel.refresh()\n    \n            binding.dogsList.apply {\n                layoutManager = LinearLayoutManager(context)\n                adapter = dogsListAdapter\n            }\n            observeViewModel()\n        }\n    \n        fun observeViewModel() {\n            viewModel.dogs.observe(viewLifecycleOwner, Observer { dogs ->\n                dogs?.let {\n                    binding.dogsList.visibility = View.VISIBLE\n                    dogsListAdapter.updateDogList(dogs)\n                }\n            })\n    \n            viewModel.dogsLoadError.observe(viewLifecycleOwner, Observer { isError ->\n                isError?.let {\n                    binding.listError.visibility = View.VISIBLE\n                }\n            })\n    \n            viewModel.loading.observe(viewLifecycleOwner, Observer { isLoading ->\n                isLoading?.let {\n                    binding.progressBar.visibility = if (it) View.VISIBLE else View.INVISIBLE\n                    if (it) {\n                        binding.listError.visibility = View.INVISIBLE\n                        binding.dogsList.visibility = View.INVISIBLE\n                    }\n                }\n            })\n        }\n    \n    }\n
Run Code Online (Sandbox Code Playgroud)\n

这是fragment_list.xml的代码:

\n
<?xml version="1.0" encoding="utf-8"?>\n<layout xmlns:android="http://schemas.android.com/apk/res/android"\n    xmlns:app="http://schemas.android.com/apk/res-auto"\n    xmlns:tools="http://schemas.android.com/tools">\n\n    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n        android:id="@+id/refreshLayout"\n        android:layout_width="match_parent"\n        android:layout_height="match_parent">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width="match_parent"\n            android:layout_height="match_parent">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id="@+id/dogsList"\n                android:layout_width="0dp"\n                android:layout_height="0dp"\n                android:layout_marginStart="1dp"\n                android:layout_marginTop="1dp"\n                android:layout_marginEnd="1dp"\n                android:layout_marginBottom="1dp"\n                app:layout_constraintBottom_toBottomOf="parent"\n                app:layout_constraintEnd_toEndOf="parent"\n                app:layout_constraintStart_toStartOf="parent"\n                app:layout_constraintTop_toTopOf="parent">\n\n            </androidx.recyclerview.widget.RecyclerView>\n\n            <TextView\n                android:id="@+id/listError"\n                android:layout_width="wrap_content"\n                android:layout_height="wrap_content"\n                android:text="@string/list_fragment_error_msg"\n                app:layout_constraintBottom_toBottomOf="@+id/dogsList"\n                app:layout_constraintEnd_toEndOf="parent"\n                app:layout_constraintStart_toStartOf="parent"\n                app:layout_constraintTop_toTopOf="@+id/dogsList" />\n\n            <ProgressBar\n                android:id="@+id/progressBar"\n                style="?android:attr/progressBarStyle"\n                android:layout_width="wrap_content"\n                android:layout_height="wrap_content"\n                app:layout_constraintBottom_toBottomOf="@+id/dogsList"\n                app:layout_constraintEnd_toEndOf="parent"\n                app:layout_constraintStart_toStartOf="parent"\n                app:layout_constraintTop_toTopOf="@+id/dogsList" />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n</layout>\n
Run Code Online (Sandbox Code Playgroud)\n

这是 MainActivity.kt:

\n
package software.genau.dogs.view\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.navigation.NavAction\nimport androidx.navigation.NavController\nimport androidx.navigation.Navigation\nimport androidx.navigation.fragment.NavHostFragment\nimport androidx.navigation.ui.NavigationUI\nimport software.genau.dogs.R\nimport software.genau.dogs.databinding.ActivityMainBinding\n\nclass MainActivity : AppCompatActivity() {\n    private lateinit var binding: ActivityMainBinding\n    private lateinit var navController: NavController\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        binding = ActivityMainBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment\n        navController = navHostFragment.navController\n\n        NavigationUI.setupActionBarWithNavController(this, navController)\n    }\n\n    override fun onSupportNavigateUp(): Boolean {\n        return NavigationUI.navigateUp(navController, null)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是activity_main.xml:

\n
<?xml version="1.0" encoding="utf-8"?>\n\n<layout xmlns:android="http://schemas.android.com/apk/res/android"\n    xmlns:app="http://schemas.android.com/apk/res-auto"\n    xmlns:tools="http://schemas.android.com/tools">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width="match_parent"\n        android:layout_height="match_parent"\n        tools:context=".view.MainActivity">\n\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id="@+id/fragmentContainerView"\n            android:name="androidx.navigation.fragment.NavHostFragment"\n            android:layout_width="0dp"\n            android:layout_height="0dp"\n            android:layout_marginStart="1dp"\n            android:layout_marginTop="1dp"\n            android:layout_marginEnd="1dp"\n            android:layout_marginBottom="1dp"\n            app:defaultNavHost="true"\n            app:layout_constraintBottom_toBottomOf="parent"\n            app:layout_constraintEnd_toEndOf="parent"\n            app:layout_constraintStart_toStartOf="parent"\n            app:layout_constraintTop_toTopOf="parent"\n            app:navGraph="@navigation/dog_navigation"\n            tools:layout="@layout/fragment_list" />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n
Run Code Online (Sandbox Code Playgroud)\n

以下是 logcat 中的错误:

\n
2021-11-17 12:29:08.420 12809-12809/software.genau.dogs E/ware.genau.dog: Failed to open file \'/data/data/software.genau.dogs/code_cache/.overlay/base.apk/res/layout/fragment_list.xml\': No such file or directory\n2021-11-17 12:29:08.420 12809-12809/software.genau.dogs D/AndroidRuntime: Shutting down VM\n2021-11-17 12:29:08.425 12809-12809/software.genau.dogs E/AndroidRuntime: FATAL EXCEPTION: main\n    Process: software.genau.dogs, PID: 12809\n    android.content.res.Resources$NotFoundException: File res/layout/fragment_list.xml from xml type layout resource ID #0x7f0b002f\n        at android.content.res.ResourcesImpl.loadXmlResourceParser(ResourcesImpl.java:1264)\n        at android.content.res.Resources.loadXmlResourceParser(Resources.java:2426)\n        at android.content.res.Resources.loadXmlResourceParser(Resources.java:2402)\n        at android.content.res.Resources.getLayout(Resources.java:1252)\n        at android.view.LayoutInflater.inflate(LayoutInflater.java:530)\n        at software.genau.dogs.view.ListFragment.onCreateView(ListFragment.kt:35)\n        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963)\n        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518)\n        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)\n        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)\n        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2106)\n        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)\n        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3138)\n        at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065)\n        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988)\n        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)\n        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)\n        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)\n        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)\n        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)\n        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072)\n        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251)\n        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502)\n        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)\n        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1435)\n        at android.app.Activity.performStart(Activity.java:8018)\n        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3475)\n        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)\n        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)\n        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)\n        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)\n        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)\n        at android.os.Handler.dispatchMessage(Handler.java:106)\n        at android.os.Looper.loop(Looper.java:223)\n        at android.app.ActivityThread.main(ActivityThread.java:7656)\n        at java.lang.reflect.Method.invoke(Native Method)\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)\n     Caused by: java.io.FileNotFoundException: res/layout/fragment_list.xml\n        at android.content.res.AssetManager.nativeOpenXmlAsset(Native Method)\n        at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:1092)\n        at android.content.res.ResourcesImpl.loadXmlResourceParser(ResourcesImpl.java:1248)\n        at android.content.res.Resources.loadXmlResourceParser(Resources.java:2426)\xc2\xa0\n        at android.content.res.Resources.loadXmlResourceParser(Resources.java:2402)\xc2\xa0\n        at android.content.res.Resources.getLayout(Resources.java:1252)\xc2\xa0\n        at android.view.LayoutInflater.inflate(LayoutInflater.java:530)\xc2\xa0\n        at software.genau.dogs.view.ListFragment.onCreateView(ListFragment.kt:35)\xc2\xa0\n        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963)\xc2\xa0\n        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518)\xc2\xa0\n        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)\xc2\xa0\n        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)\xc2\xa0\n        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2106)\xc2\xa0\n        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)\xc2\xa0\n        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3138)\xc2\xa0\n        at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065)\xc2\xa0\n        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988)\xc2\xa0\n        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)\xc2\xa0\n        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)\xc2\xa0\n        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)\xc2\xa0\n        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)\xc2\xa0\n        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)\xc2\xa0\n        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072)\xc2\xa0\n        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251)\xc2\xa0\n        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502)\xc2\xa0\n        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)\xc2\xa0\n        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1435)\xc2\xa0\n        at android.app.Activity.performStart(Activity.java:8018)\xc2\xa0\n        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3475)\xc2\xa0\n        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)\xc2\xa0\n        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)\xc2\xa0\n        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)\xc2\xa0\n        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)\xc2\xa0\n        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)\xc2\xa0\n        at android.os.Handler.dispatchMessage(Handler.java:106)\xc2\xa0\n        at android.os.Looper.loop(Looper.java:223)\xc2\xa0\n        at android.app.ActivityThread.main(ActivityThread.java:7656)\xc2\xa0\n        at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)\xc2\xa0\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)\xc2\xa0\n
Run Code Online (Sandbox Code Playgroud)\n

小智 8

我通过在 XML(代码编辑器)中进行一些小更改解决了这个问题,例如更改或添加布局文件中任何视图的边距。然后我转到顶部菜单“构建”->“清理项目”,然后依次选择“构建”->“重建项目”。我认为发生的情况是 Android Studio/Gradle 丢失了对文件所做的更改的跟踪,因此在重新编译时不会包含它,因为它认为它未经修改。通过对文件进行小的任意更改,Gradle 会发现它已被修改,因此包含了预期的布局。