当前位置: 首页 > 知识库问答 >
问题:

Android:是每次点击导航抽屉项目时创建一个新片段更好,还是加载以前创建的片段更好?

漆雕彦
2023-03-14

我正在实现Android的标准抽屉菜单模式,用户可以从抽屉导航到大约10个片段。目前,每次点击不同的抽屉菜单项时,我都会创建一个新的片段,如下所示:

// When a new navigation item at index is clicked 
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
Fragment newFragment = null;
if (index == 0)
    fragment = new Fragment0();
...
ft.replace(R.id.container, newFragment);
ft.commit();

我一直在想,这样做是否更有效:

// Somewhere in onCreate
Fragment[] fragments = new Fragment[n];
fragments[0] = new Fragment0();
fragments[1] = new Fragment1();
...

// When a new navigation item (at index) is clicked 
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.replace(R.id.container, fragments[index]);
ft.commit();

我主要担心的是,一些片段包含大量数据(相当大的列表和大量的视图)。将所有这些片段保存在内存中会有任何问题吗?与每次实例化新片段相比,它会提供任何优势吗(除了片段之间更快的切换)?是否有一个普遍接受的“更好”解决方案?

共有1个答案

姚嘉容
2023-03-14

我也有类似的问题。我采用了与您类似的方法,为了节省处理器的负载,我对每个调用进行了以下调整,以创建片段对象的实例:(在selectItem方法中使用的上下文中)

switch (position) {
    case 0:
        if (fragmentOne == null)
            fragmentOne = new FragmentOne();
        getSupportFragmentManager().beginTransaction().......
        break;
    case 1:
        if (fragmentTwo == null)
            fragmentTwo = new FragmentTwo();
        getSupportFragmentManager()......

FragmentOne和FragmentTwo是两个不同的片段类,FragmentOne和FragmentTwo是它们在MainActivity中声明为字段的对象

编辑:

我想补充一点,您可以如何使用类似的方法来处理包含片段的数组。不要在onCreate中创建新片段,而是在单击项目时创建新片段。在onCreate中,向抽屉发送一个调用,以选择您希望在启动时默认选择的片段。

//somewhere in onCreate
if (savedInstanceState == null) {
    selectItem(defaultFragment);
}
else
    selectItem(selectedFragment);
//selectItem is method called by DrawerItemClickListener as well


//in selectItem: when navigation item at index is clicked, the listener calls this
switch (index) {
    case 0:
        if (fragments == null) {
            fragments = new Fragment[n];
            fragment[0] = new Fragment0();
        }
        else if (fragments[0] == null) {
            fragments[0] = new Fragment0();
        }
        break;
    ....
}
FragmentTransaction ft = fragmentManager.beginTransaction();
...
ft.replace(R.id.container, fragments[index]);
ft.commit();

无需在onCreate上实例化片段,因为这会使启动速度变慢。根据需要创建它们,然后使用相同的(如果存在)。只有在第一次加载时,才会创建新片段。

 类似资料:
  • 我有导航抽屉的BaseActivity,我在其中使用片段管理器在片段布局中显示/隐藏片段,当单击每个导航抽屉项时,我希望每次单击导航项时都刷新我的片段。我尝试了两种方法,例如片段附加/分离,但它不起作用,有谁能帮我在每次点击导航项时刷新我的片段吗。

  • 我是一名iOS开发者,我开始尝试将我的一个应用程序移植到Android。一切都很顺利,直到我遇到了一个问题,这让我在过去几天里步履维艰。 我的应用程序使用的是导航抽屉模板,工作正常。通过点击所需的导航项,我可以很容易地在片段之间切换。然而,问题是当我试图从现有片段中切换内容时。换句话说,我的一个片段上有一个按钮,单击时,我希望它用另一个片段替换内容。我已经使用以下代码实现了这一点: 当此代码切换到

  • 我有一个主活动启动导航抽屉。 也有一些片段。 我需要从片段内部更改导航抽屉列表的标题。 我尝试了这个内部片段: 但是到目前为止还没有运气。这是我的主要活动: 在主活动类中使用相同的方法有效,但在片段中无效。我不知道如何更新字符串并通知抽屉此更改!

  • 这里是链接的代码,我正在做同样的事情链接

  • 在我的应用程序中,我创建了一个导航抽屉,其中有5个项目,一旦在导航抽屉中单击一个项目,我就可以正确地检查该项目,并使用片段管理器显示新片段。但目前我有三个问题: > 我在某种程度上解决了这个问题,但使用了一个方法,在MainActivity中执行片段事务,同时检查新项。因此,每当一个片段想要调用另一个片段时,它都会使用这个函数传递nav\u drawer\u item\u id作为参数。我认为这个

  • 问题内容: 我知道这些类型的问题已经在这里,但仍然找不到这个问题的答案: 我已经创建了一个应用程序,并使用了由该应用程序自动创建的导航抽屉(AndroidStudio) 这是我所拥有的: 还有更多: 我想使用导航抽屉中的按钮显示另一个片段。我想使用此代码,所以请不要向我发送任何制作自己的抽屉的指南或教程。 现在的问题是,我该怎么放 ,并在情况下,我想打开另一个片段?谢谢。 还有一个问题: 如何添加