android-fragments 使用导航用片段膨胀类布局时出错

iqxoj9l9  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(159)

我得到这个错误时,试图运行这个应用程序。我已经遵循了无数的指南无济于事。我只是试图做简单的练习与导航。
我的应用应该有一个activity(mainactivity)和两个子片段,第一个(TitleFragment)是home片段,它有一个按钮,可以调用findNavController().navigate来导航到第二个片段(它只是一个空白的默认片段)。
然而,应用程序将不会运行-得到下面的错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lbaron.test1/com.lbaron.test1.MainActivity}: android.view.InflateException: Binary XML file line #2 in com.lbaron.test1:layout/activity_main: Binary XML file line #2 in com.lbaron.test1:layout/activity_main: Error inflating class layout

MainActivity.kt

package com.lbaron.test1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/myNavHostFragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:navGraph="@navigation/navigation"
            app:defaultNavHost="true"/>
    </LinearLayout>
</layout>

TitleFragment.kt

package com.lbaron.test1

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.navigation.fragment.findNavController

class TitleFragment : Fragment() {

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

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_title, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val btn: Button = view.findViewById(R.id.btn)
        btn.setOnClickListener(View.OnClickListener { view -> findNavController().navigate(R.id.action_titleFragment_to_mainContent) })
    }
}

fragment_title.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=".TitleFragment">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="title fragment" />
    <Button
        android:id="@+id/btn"
        android:layout_width="200dp"
        android:layout_gravity="center"
        android:layout_height="wrap_content"
        android:text="click"/>
</FrameLayout>

navigation.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    app:startDestination="@id/titleFragment">

    <fragment
        android:id="@+id/titleFragment"
        android:name="com.lbaron.test1.TitleFragment"
        android:label="TitleFragment" >
        <action
            android:id="@+id/action_titleFragment_to_mainContent"
            app:destination="@id/mainContent" />
    </fragment>
    <fragment
        android:id="@+id/mainContent"
        android:name="com.lbaron.test1.MainContent"
        android:label="fragment_main_content"
        tools:layout="@layout/fragment_main_content" />
</navigation>

我的问题是:为什么我不能扩大我的班级布局?
非常感谢-所有的帮助感激不尽。

dwthyt8l

dwthyt8l1#

正如编译器所说,它不能膨胀activity_main.xml文件中使用的<layout>父视图,这可能是因为它没有定义。
尝试按如下方式编辑XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <androidx.fragment.app.FragmentContainerView
            android:id="@+id/myNavHostFragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:navGraph="@navigation/navigation"
            app:defaultNavHost="true"/>

</LinearLayout>
siv3szwd

siv3szwd2#

尝试按如下方式编辑XML:我也是这样工作的。

<fragment
        android:id="@+id/myNavHostFragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:navGraph="@navigation/navigation"
        app:defaultNavHost="true"/>
hgqdbh6s

hgqdbh6s3#

确保在导航图中包含开始时的片段。然后,您的Activity可以“在数据绑定的情况下”膨胀,如下所示:
在此,您可以创建一个新的视图,并将其添加到活动中。

相关问题