提问人:Asad 提问时间:11/14/2023 更新时间:11/15/2023 访问量:22
当我使用 androidx.fragment.app.FragmentContainerView 时,android 应用程序在启动时崩溃
the android app crashes on launch when I use androidx.fragment.app.FragmentContainerView
问:
我只是 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.AppCompatActivity
androidx.activity.ComponentActivity
super.onCreateView(inflater, container, savedInstanceState)
答:
您有两种选择:
First(Recommended):创建一个导航文件并附加到 fragmentContainer 中
步骤
设置导航图
- 添加导航图文件(“新建文件”>“> Android 资源文件)并按如下方式填写字段。会是这样的
- 文件名: nav_graph.xml.这与您为 app:navGraph 属性设置的名称相同。
- 资源类型:导航。然后,目录名称应自动更改为导航。将创建一个名为“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!
希望这有帮助,让我知道。
评论