Ozg*_*ewn 3 navigation android fragment android-fragments kotlin
所以我试图让我的片段与导航组件一起工作,但由于某种原因我遇到了这个异常。我已经搜索了一些解决方案,但没有找到我的解决方案。不要介意一些西班牙变量。\n我收到异常:
\njava.lang.RuntimeException: Unable to start activity ComponentInfo{com.iesnervion.pmdmo_prac2eva/com.iesnervion.pmdmo_prac2eva.view.MainActivity}: android.view.InflateException: Binary XML file line #32: Binary XML file line #32: Error inflating class androidx.fragment.app.FragmentContainerView\nRun Code Online (Sandbox Code Playgroud)\n它说其原因是:
\nCaused by: android.view.InflateException: Binary XML file line #32: Binary XML file line #32: Error inflating class androidx.fragment.app.FragmentContainerView\nRun Code Online (Sandbox Code Playgroud)\n我的片段:
\nclass TiendaFragment : Fragment(), SearchView.OnQueryTextListener {\n// TODO: Rename and change types of parameters\nprivate var param1: String? = null\nprivate var param2: String? = null\nprivate lateinit var adapter: ProductoAdapter\nprivate var listaProductos = mutableListOf<ProductoEntidad>()\nprivate var _binding: FragmentTiendaBinding? = null\nprivate val binding get() = _binding!!\nprivate val productoViewModel: ProductoViewModel by activityViewModels()\nprivate lateinit var navController: NavController\n\noverride fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n arguments?.let {\n param1 = it.getString(ARG_PARAM1)\n param2 = it.getString(ARG_PARAM2)\n }\n\n val database = Room.databaseBuilder(requireContext(), ProductoDatabase::class.java, "tienda-db").fallbackToDestructiveMigration().build()\n\n val productos = ProductoService().getAllProductos()\n lifecycleScope.launch {\n productos.forEach { database.getDao().insertProductos(it) }\n }\n\n binding.svProductos.setOnQueryTextListener(this)\n}\n\noverride fun onCreateView(\n inflater: LayoutInflater, container: ViewGroup?,\n savedInstanceState: Bundle?\n): View? {\n _binding = FragmentTiendaBinding.inflate(inflater, container, false)\n return binding.root\n}\n\noverride fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n super.onViewCreated(view, savedInstanceState)\n navController = findNavController()\n inicializarRecyclerView()\n}\n\nfun inicializarRecyclerView(){\n adapter = ProductoAdapter(listaProductos){ onProductoSeleccionado(it) }\n binding.rvProductos.layoutManager = LinearLayoutManager(requireContext())\n binding.rvProductos.adapter = adapter\n\n productoViewModel.getAllProductos()\n val productos = productoViewModel.productoModel\n listaProductos.removeAll(listaProductos)\n listaProductos.addAll(productos)\n adapter.notifyDataSetChanged()\n}\n\nprivate fun onProductoSeleccionado(producto: ProductoEntidad){\n productoViewModel.productoSeleccionado.postValue(producto)\n navController.navigate(R.id.action_tiendaFragment_to_detallesFragment)\n}\n\nprivate fun searchByName(query: String){\n CoroutineScope(Dispatchers.IO).launch {\n val listaProductosLlamada = ProductoService().getAllProductos()\n if(!listaProductosLlamada.isNullOrEmpty()){\n listaProductos.clear()\n listaProductos.addAll(listaProductosLlamada)\n adapter.notifyDataSetChanged()\n }else{\n showError()\n }\n hideKeyboard()\n }\n}\n\n/**\n * Oculta el teclado, sin mas, no hay que profundizar mucho en esto\n */\nprivate fun hideKeyboard(){\n val imm = requireActivity().getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager\n imm.hideSoftInputFromWindow(binding.root.windowToken, 0)\n}\n\nprivate fun showError(){\n Toast.makeText(requireContext(), "Ha ocurrido un error", Toast.LENGTH_SHORT).show()\n}\n\noverride fun onQueryTextSubmit(query: String?): Boolean {\n if(!query.isNullOrEmpty()){ //no uso el query?.let ya que eso solo funciona con nulos, pero no cuando esta vacio\n searchByName(query.lowercase())\n }\n return true\n}\n\noverride fun onQueryTextChange(newText: String?): Boolean {\n return true //ya que no queremos que pase nada con cada cambio en el texto, solo queremos que se cambie cuando se busque\n}\n\ncompanion object {\n /**\n * Use this factory method to create a new instance of\n * this fragment using the provided parameters.\n *\n * @param param1 Parameter 1.\n * @param param2 Parameter 2.\n * @return A new instance of fragment TiendaFragment.\n */\n // TODO: Rename and change types and number of parameters\n @JvmStatic\n fun newInstance(param1: String, param2: String) =\n TiendaFragment().apply {\n arguments = Bundle().apply {\n putString(ARG_PARAM1, param1)\n putString(ARG_PARAM2, param2)\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我的片段 XML:
\n<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"\nxmlns:tools="http://schemas.android.com/tools"\nandroid:layout_width="match_parent"\nandroid:layout_height="match_parent"\nxmlns:app="http://schemas.android.com/apk/res-auto"\ntools:context=".fragments.TiendaFragment">\n\n<androidx.constraintlayout.widget.ConstraintLayout\n android:layout_width="match_parent"\n android:layout_height="match_parent">\n\n <androidx.appcompat.widget.SearchView\n android:id="@+id/svProductos"\n android:layout_width="250dp"\n android:layout_height="0dp"\n app:layout_constraintTop_toTopOf="parent"\n app:layout_constraintLeft_toLeftOf="parent"\n app:layout_constraintRight_toRightOf="parent" />\n\n <androidx.recyclerview.widget.RecyclerView\n android:id="@+id/rvProductos"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n app:layout_constraintTop_toTopOf="parent"\n app:layout_constraintLeft_toLeftOf="parent"\n app:layout_constraintRight_toRightOf="parent"\n app:layout_constraintBottom_toTopOf="@+id/precioTotalValue" />\n\n <TextView\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:id="@+id/txtPrecioTotal"\n app:layout_constraintLeft_toLeftOf="parent"\n app:layout_constraintBottom_toBottomOf="parent"\n android:text="Precio:"\n android:layout_marginLeft="12dp"\n android:layout_marginBottom="25dp"\n android:textSize="25sp" />\n\n <TextView\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:id="@id/precioTotalValue"\n app:layout_constraintBottom_toBottomOf="parent"\n app:layout_constraintLeft_toRightOf="@id/txtPrecioTotal"\n android:layout_marginLeft="12dp"\n tools:text="25\xe2\x82\xac"\n android:layout_marginBottom="25dp"\n android:textSize="25sp" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\nRun Code Online (Sandbox Code Playgroud)\n\n\n这是 Activity_main.xml (我在其中收到错误):
\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"\nxmlns:app="http://schemas.android.com/apk/res-auto"\nxmlns:tools="http://schemas.android.com/tools"\nandroid:layout_width="match_parent"\nandroid:layout_height="match_parent"\ntools:context=".view.MainActivity">\n\n<TextView\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:id="@+id/titulo"\n app:layout_constraintTop_toTopOf="parent"\n app:layout_constraintLeft_toLeftOf="parent"\n app:layout_constraintRight_toRightOf="parent"\n android:text="@string/shop_name"\n android:layout_marginTop="15dp"\n android:textSize="25sp" />\n\n<androidx.fragment.app.FragmentContainerView\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:id="@+id/nav_host_fragment_container"\n android:name="androidx.navigation.fragment.NavHostFragment"\n app:layout_constraintTop_toBottomOf="@id/titulo"\n app:layout_constraintLeft_toLeftOf="parent"\n app:layout_constraintRight_toRightOf="parent"\n app:layout_constraintBottom_toBottomOf="parent"\n\n app:defaultNavHost="true"\n app:navGraph="@navigation/nav_graph"\n />\nRun Code Online (Sandbox Code Playgroud)\n我不知道你是否需要这个,但这是我的 nav_graph.xml
\n<navigation xmlns:android="http://schemas.android.com/apk/res/android"\nxmlns:app="http://schemas.android.com/apk/res-auto"\nxmlns:tools="http://schemas.android.com/tools"\nandroid:id="@+id/nav_graph"\napp:startDestination="@id/tiendaFragment">\n<fragment\n android:id="@+id/tiendaFragment"\n android:name="com.iesnervion.pmdmo_prac2eva.fragments.TiendaFragment"\n android:label="fragment_tienda"\n tools:layout="@layout/fragment_tienda" >\n <action\n android:id="@+id/action_tiendaFragment_to_detallesFragment"\n app:destination="@id/detallesFragment" />\n</fragment>\n<fragment\n android:id="@+id/detallesFragment"\n android:name="com.iesnervion.pmdmo_prac2eva.fragments.DetallesFragment"\n android:label="fragment_detalles"\n tools:layout="@layout/fragment_detalles" />\nRun Code Online (Sandbox Code Playgroud)\n\n感谢您尝试提供帮助,如果您需要其他文件才能找到修复程序,只需评论即可
\n编辑:
\n这是完整的堆栈跟踪:
\nE/AndroidRuntime: FATAL EXCEPTION: main\nProcess: com.iesnervion.pmdmo_prac2eva, PID: 13690\njava.lang.RuntimeException: Unable to start activity ComponentInfo{com.iesnervion.pmdmo_prac2eva/com.iesnervion.pmdmo_prac2eva.view.MainActivity}: android.view.InflateException: Binary XML file line #32: Binary XML file line #32: Error inflating class androidx.fragment.app.FragmentContainerView\n at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)\n at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)\n at android.app.ActivityThread.-wrap11(Unknown Source:0)\n at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)\n at android.os.Handler.dispatchMessage(Handler.java:105)\n at android.os.Looper.loop(Looper.java:164)\n at android.app.ActivityThread.main(ActivityThread.java:6541)\n at java.lang.reflect.Method.invoke(Native Method)\n at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)\n Caused by: android.view.InflateException: Binary XML file line #32: Binary XML file line #32: Error inflating class androidx.fragment.app.FragmentContainerView\n Caused by: android.view.InflateException: Binary XML file line #32: Error inflating class androidx.fragment.app.FragmentContainerView\n Caused by: java.lang.NullPointerException\n at com.iesnervion.pmdmo_prac2eva.fragments.TiendaFragment.getBinding(TiendaFragment.kt:47)\n at com.iesnervion.pmdmo_prac2eva.fragments.TiendaFragment.onCreate(TiendaFragment.kt:65)\n at androidx.fragment.app.Fragment.performCreate(Fragment.java:2981)\n at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:474)\n at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:257)\n at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1840)\n at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1764)\n at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1701)\n at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2849)\n at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:2773)\n at androidx.fragment.app.Fragment.onCreate(Fragment.java:1913)\n at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:264)\n at androidx.fragment.app.Fragment.performCreate(Fragment.java:2981)\n at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:474)\n at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:257)\n at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1840)\n at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1764)\n at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1670)\n at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:323)\n at androidx.fragment.app.FragmentContainerView.<init>(FragmentContainerView.kt:158)\n at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:53)\n at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)\n at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:295)\n at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:274)\n at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:780)\n at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)\n at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)\n at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)\n at android.view.LayoutInflater.inflate(LayoutInflater.java:515)\n at android.view.LayoutInflater.inflate(LayoutInflater.java:423)\n at android.view.LayoutInflater.inflate(LayoutInflater.java:374)\n\nE/AndroidRuntime: at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:706)\n at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:195)\n at com.iesnervion.pmdmo_prac2eva.view.MainActivity.onCreate(MainActivity.kt:16)\n at android.app.Activity.performCreate(Activity.java:6975)\n at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)\n at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)\n at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)\n at android.app.ActivityThread.-wrap11(Unknown Source:0)\n at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)\n at android.os.Handler.dispatchMessage(Handler.java:105)\n at android.os.Looper.loop(Looper.java:164)\n at android.app.ActivityThread.main(ActivityThread.java:6541)\n at java.lang.reflect.Method.invoke(Native Method)\n at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)\nRun Code Online (Sandbox Code Playgroud)\n编辑2:\n我的活动中有2个片段,在这里您可以看到设计视图:\n
这是我的 MainActivity 代码:
\nclass MainActivity : AppCompatActivity() {\noverride fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.activity_main)\n\n}\nRun Code Online (Sandbox Code Playgroud)\n}
\nonCreate()现在访问还为时过早binding,您只是在稍后进行设置onCreateView()。
例如,您可以将 移动binding.svProductos.setOnQueryTextListener(this)到onViewCreated()。