Android 在活动中创建片段实例并重用它是否是一种糟糕的编码实践?

Android 在活动中创建片段实例并重用它是否是一种糟糕的编码实践?,android,android-fragments,kotlin,Android,Android Fragments,Kotlin,有一个活动和两个片段。 您可以通过按下按钮(在选项菜单的操作栏中)切换到其他片段。 按下按钮,片段将被相应的其他片段替换 为了确保将正确的片段放入片段容器,首先必须识别当前显示的片段,然后替换它 when(supportFragmentManager.findFragmentByTag("test")!!.id) { foodListFragment.id -> { supportFragmentManager .beginTransacti

有一个活动和两个片段。 您可以通过按下按钮(在选项菜单的操作栏中)切换到其他片段。 按下按钮,片段将被相应的其他片段替换

为了确保将正确的片段放入片段容器,首先必须识别当前显示的片段,然后替换它

when(supportFragmentManager.findFragmentByTag("test")!!.id) {
    foodListFragment.id -> {
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.main_fragment_container,consumedFoodListFragment,"test")
            .commit()
    }
    consumedFoodListFragment.id -> {
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.main_fragment_container,foodListFragment,"test")
            .commit()
    }
}
我遇到的一个问题是fragment.id依赖于实例而不是固定的,因此我在主活动类中创建了两个实例:

class MainActivity : AppCompatActivity() {

    private val foodListFragment by lazy { FoodListFragment() }
    private val consumedFoodListFragment by lazy { ConsumedFoodListFragment() }

    ...
}
(1) 我的主要问题是:这是一种不好的做法吗?我的假设是肯定的,因为在主活动中存在对片段的引用,片段生命周期依赖于活动生命周期,这是错误的,因为片段的生命周期应该独立于活动的生命周期?这个推理正确吗


(2) 另一个问题是:对于这个问题(识别当前显示的片段并替换它),什么是更优雅的解决方案?

回答您的第一个问题

1) 碎片的生命周期确实取决于生命的活动 没有它们,循环就不可能存在。是的,这是一个坏习惯 考虑到您的用例。在我看来,这是拯救世界的糟糕做法 实例,但在某些情况下,您的 用户经常访问这些片段,而您不希望 每次都要重新创建它们并保持它们的状态 只有两个碎片,所以没问题

2) 有一个片段管理器可以这样做,下面是 我们可以找到一些现在还活着的片段

1) 查找在从XML膨胀时由给定id标识的片段,或在事务中添加时作为容器id标识的片段

findFragmentById(int id)

//example
getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
findFragmentByTag(String tag)

 //example
getActivity().getFragmentManager().findFragmentByTag("fragment_first");
2) 查找由给定标记标识的片段,该标记在从XML膨胀时标识,或在事务中添加时标识

findFragmentById(int id)

//example
getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
findFragmentByTag(String tag)

 //example
getActivity().getFragmentManager().findFragmentByTag("fragment_first");
3) 获取当前添加到FragmentManager的所有片段的列表

getFragments()

注意事项:也请注意,如果在碎片中没有繁重的工作,您可以考虑重新创建它们。

(2)<代码> SputsFractMealgs.FiffFraceMeByType(“test”)是FooListFrace</代码>?
is FoodListFragment
也可以用作
when
语句中的条件。