我正在开发一个移动的应用程序,目前正在尝试重新设计工作流程,以便更恰当地利用Activity和Fragments来实现其预期目的,但我遇到了一个无法解决的奇怪问题。我尝试将一个片段添加到Activity中,但我尝试使用FragmentContainerView时,应用程序在启动时崩溃,但是当我只使用具有所有相同属性的标记时就不会发生这种情况。该错误来自于将null赋给utils文件的最后一行,在该行中,utils试图将id为top_app_bar的视图赋给topAppBar视图。下面是相关代码:
MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fragmentManager.beginTransaction().replace(R.id.frame_layout, HomeFragment()).commit()
utils = Utils(this)
topAppBar = findViewById(R.id.top_app_bar)
drawerLayout = findViewById(R.id.drawer_layout)
val navigationView: NavigationView = findViewById(R.id.navigation_view)
topAppBar.setNavigationOnClickListener {
if (!drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.openDrawer(GravityCompat.START)
}
else {
drawerLayout.closeDrawer(GravityCompat.START)
}
}
navigationView.setNavigationItemSelectedListener { item ->
val id: Int = item.itemId
drawerLayout.closeDrawer(GravityCompat.START)
when (id) {
R.id.navigation_home -> { utils.replaceFragment(HomeFragment(), getString(R.string.app_name)) }
R.id.navigation_recipes -> { utils.replaceActivity(this, item.title.toString().lowercase()) }
R.id.navigation_budget -> { utils.replaceActivity(this, item.title.toString().lowercase()) }
R.id.navigation_inventory -> { utils.replaceActivity(this, item.title.toString().lowercase()) }
R.id.navigation_customers -> { utils.replaceActivity(this, item.title.toString().lowercase()) }
R.id.navigation_reports -> { utils.replaceActivity(this, item.title.toString().lowercase()) }
}
true
}
activity_main.xml
<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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.bakingapp.ui.TopAppBarFragment"
tools:layout="@layout/fragment_top_app_bar" />
Utils.kt(此文件有更多内容,但与问题无关)
class Utils(activity: Activity) {
private var currentActivity: Activity
private var fragmentManager: FragmentManager
private var topAppBar: MaterialToolbar
val activitiesList = listOf("recipes", "budget", "inventory", "customers",
"reports")
init {
currentActivity = activity
fragmentManager = (activity as AppCompatActivity).supportFragmentManager
topAppBar = currentActivity.findViewById(R.id.top_app_bar)
}
}
当我使用而不是当前存在的标签时,这个方法工作得很好,但是我收到警告说我不应该使用fragment。我应该能够使用更合适的标签,但是我不明白为什么当我使用这个方法时,它找不到视图,但是当我使用标签时,它可以找到视图。如果有人能解释一下这里发生了什么,以及我可以做些什么来解决这个问题,我会非常感激的。
3条答案
按热度按时间xkrw2x1b1#
步骤1:将
FragmentContainerView
添加到活动xml中步骤2:在
MainActivity.class
文件中,声明FragmentManager
步骤3:在
onCreate()
中初始化FragmentManager
第4步:在
onOptionsItemSelected()
中开始这个片段htzpubme2#
你有没有试过把
FragmentContainerView
放在一个布局里面?而不是把它作为父布局。这样就可以解决这个问题了。ktecyv1j3#
我设法解决了这个问题。这是一个范围问题。我在MainActivity中处理的片段有很多逻辑。我将onCreate函数中的几乎所有内容移到了相关的片段文件中,并在重构了这段代码后,从那里能够使FragmentContainerView正常工作