android-fragments 使用时出错< FragmentContainerView>,但使用时没有出错< fragment>

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

我正在开发一个移动的应用程序,目前正在尝试重新设计工作流程,以便更恰当地利用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。我应该能够使用更合适的标签,但是我不明白为什么当我使用这个方法时,它找不到视图,但是当我使用标签时,它可以找到视图。如果有人能解释一下这里发生了什么,以及我可以做些什么来解决这个问题,我会非常感激的。

xkrw2x1b

xkrw2x1b1#

步骤1:将FragmentContainerView添加到活动xml中

<androidx.fragment.app.FragmentContainerView
     android:id="@+id/container"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />

步骤2:在MainActivity.class文件中,声明FragmentManager

private FragmentManager manager;

步骤3:在onCreate()中初始化FragmentManager

manager = getSupportFragmentManager();

第4步:在onOptionsItemSelected()中开始这个片段

Bundle bundle = new Bundle();
manager.beginTransaction()
                .replace(R.id.container/*Your View Id*/, YourFragment.class, bundle, "TAG")
                .setReorderingAllowed(true)
                //.setCustomAnimations(R.anim.anim_enter, R.anim.anim_exit)
                .addToBackStack("TAG")
                .commit();
htzpubme

htzpubme2#

你有没有试过把FragmentContainerView放在一个布局里面?而不是把它作为父布局。这样就可以解决这个问题了。

ktecyv1j

ktecyv1j3#

我设法解决了这个问题。这是一个范围问题。我在MainActivity中处理的片段有很多逻辑。我将onCreate函数中的几乎所有内容移到了相关的片段文件中,并在重构了这段代码后,从那里能够使FragmentContainerView正常工作

相关问题