当我使用 androidx.fragment.app.FragmentContainerView 时,android 应用程序在启动时崩溃

the android app crashes on launch when I use androidx.fragment.app.FragmentContainerView

提问人:Asad 提问时间:11/14/2023 更新时间:11/15/2023 访问量:22

问:

我只是 Android 开发的初学者,我正在阅读这本书“Head first Android development”。 我应该在本书的第 6 章中制作一个秘密消息应用程序,我完全按照书中所说的做了。我将我的代码与书中的代码进行了比较,并确保它们是相同的,但是当我尝试在android studio的android设备模拟器上启动它时,应用程序在启动时崩溃。有错误消息说“秘密消息应用程序不断停止” 我想知道你们能不能帮我解决这个问题。

这是我的代码:

MainActivity.kt (英语)

package com.hfad.secretmessage

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

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

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragment_container_view_tag"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:name="com.hfad.secretmessage.WelcomeFragment"
    tools:layout="@layout/fragment_welcome"/>

欢迎片段.kt

package com.hfad.secretmessage


import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

class WelcomeFragment : Fragment(){
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_welcome, container, false)
    }
}

fragment_welcome.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    tools:context=".WelcomeFragment">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_marginTop="20dp"
        android:textSize="20sp"
        android:text="@string/welcome_text"/>

    <Button
        android:id="@+id/start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="@string/start"/>

</LinearLayout>

字符串.xml

<resources>
    <string name="app_name">Secret Message</string>
    <string name="welcome_text">Welcome to the Secret Message app!
        Use this app to encrypt a secret message.
        Click on the Start button to begin.</string>
    <string name="start">Start</string>
    <string name="message_hint">Please enter your secret message</string>
    <string name="next">Next</string>
    <string name="encrypt_text">Here is your encrypted message:</string>
    <!-- TODO: Remove or change this placeholder text -->
    <string name="hello_blank_fragment">Hello blank fragment</string>

</resources>

我尝试使用该类而不是,并将代码添加到 WelcomeFragment.kt 中,但结果是一样的。androidx.appcompat.app.AppCompatActivityandroidx.activity.ComponentActivitysuper.onCreateView(inflater, container, savedInstanceState)

Android-AppCompat

评论

1赞 CommonsWare 11/14/2023
“There is error message” -- 使用 Logcat 检查与崩溃关联的堆栈跟踪

答:

0赞 Abdelrahman Mahmoud Nasr 11/15/2023 #1

您有两种选择:

First(Recommended):创建一个导航文件并附加到 fragmentContainer 中

步骤

设置导航图

  1. 添加导航图文件(“新建文件”>“> Android 资源文件)并按如下方式填写字段。会是这样的
  2. 文件名: nav_graph.xml.这与您为 app:navGraph 属性设置的名称相同。
  3. 资源类型:导航。然后,目录名称应自动更改为导航。将创建一个名为“navigation”的新资源文件夹。

创建 XML 文件后,将显示一个新的可视化编辑器。要添加新的目标,请单击屏幕左上角的“新建”按钮,然后为每个片段创建一个目标(一个用于fragment_letter_list,一个用于fragment_word_list)。喜欢这个

引用 FragmentContainer 中的nav_graph

将此行添加到 FragmentContainer 中

app:navGraph="@navigation/nav_graph"

添加一些代码来初始化 navController

private lateinit var navController: NavController

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

val navHostFragment = supportFragmentManager
    .findFragmentById(R.id.nav_host_fragment) as NavHostFragment
navController = navHostFragment.navController
    }

你可以在这里找到更多帮助:https://developer.android.com/codelabs/basic-android-kotlin-training-fragments-navigation-component#7 但这有点高级,我告诉你基本步骤。

第二种选择只需将此代码添加到 onCreate 乐趣中即可

val fragment = WelcomeFragment()
supportFragmentManager.beginTransaction()
    .replace(R.id.fragment_container, fragment)
    .commit()

此代码将简单地在 fragment 容器中显示 fragment!

希望这有帮助,让我知道。