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

我应该在底部导航栏中使用多少活动?

咸育
2023-03-14

我是相当新的android工作室,任何帮助将不胜感激。

我在MainActivity中通过编程设置了一个底部导航栏——用其他片段设置它的最佳方式是什么。我有三个片段,导航栏中的每个选项卡一个片段,其他片段可以在按下导航栏片段中的按钮时打开。我在哪里设置这些其他片段?在连接到导航栏的片段的同一活动中,或在不同活动中。

如何保存显示片段的当前状态,以便当我移动到不同的选项卡并返回时,它将处于与我离开时相同的状态?

共有2个答案

郜联
2023-03-14

我想扩展@rupps所说的内容,因为我觉得关于FragmentManager/Transaction做什么的部分没有从您期望的地方开始。

我假设您使用的是BottomNavigationView。

无论Fragments的(重要的)生命周期如何,您都必须了解一个片段总是附加到一个活动中(注意:这不是真的,但我们现在不要谈论无头片段)。

您可以采取的方法是活动布局如下:(在伪代码中)

<RelativeLayout width=match_parent height=match_parent>
  <FrameLayout 
     id="@+id/your_fragment_container" 
     width=match_parent 
     height=match_parent
     layout_above="@+id/navbar" />
  <BottomNavigationView 
     id="@id/navbar"
     width=match_parent 
     height=wrap_content 
     align_parent_bottom=true />
</RelativeLayout>

这样,底部导航栏将始终显示在布局的底部。

现在,您必须处理将片段放在那里的问题……假设您需要将一个侦听器附加到该条上,并且当您收到一个已选择新菜单项的回调时……您可以继续更改片段(启动时总是会得到一个事件,或者我想您可以在onCreate期间强制它)。

您将向onNavigationItemSelected(MenuItem项)方法添加switch/if语句。

并调用addFragment(TAG) 取决于它是哪种情况。

为您提供的伪代码:

private void addFragment(final String tag) {
        final Fragment existing = getSupportFragmentManager().findFragmentByTag(tag);

        if (existing == null) {
            final Fragment newInstance = getNewFragmentInstanceWithTag(tag);
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(getFragmentContainerLayout(), newInstance, tag)
                    .commit();
        }
}

您还需要提供:

private int getFragmentContainerLayout() {
    return R.id.your_fragment_container;
}

还有…

public static final String TAB1_TAG = "TAB1_TAG";
public static final String TAB2_TAG = "TAB2_TAG";
public static final String TAB3_TAG = "TAB3_TAG";

protected Fragment getNewFragmentInstanceWithTag(String tag) {
    switch (tag) {
        case TAB1_TAG:
            return Tab1Fragment.newInstance();
        case TAB2_TAG:
            return Tab2Fragment.newInstance();
        case TAB3_TAG:
            return Tab3Fragment.newInstance();
        default:
            return null;
    }
}

那么碎片管理器/事务是什么呢?

将Manager视为一个单例对象(每个应用程序一个),它保留对Fragments的引用并可以为您检索它们(如果它们以前存在)。它处理事务(添加/删除/隐藏/显示等),以便您稍后可以回滚它们(假设您在事务中添加一个片段,如果您还addToBackStack()那么您可以简单地告诉Manager:弹出最后一个事务,有效地回滚它。

它是一个怪物。它有9000多年的虫子,而且不是很直观;但是一旦你习惯了,你就可以“使用它”。

林冥夜
2023-03-14

我的问题是,我在哪里设置这些其他片段?在连接到导航栏的片段的同一活动中,或在不同活动中。

这实际上取决于您以及您想如何显示片段。您可以在同一活动中显示它们,也可以打开另一个活动。但是,请记住,如果打开另一个活动,您将丢失上一个活动的导航栏(一个活动始终使用整个屏幕)

FragmentManager和FragmentTransaction究竟做什么?

如何保存显示片段的当前状态,以便在移动到其他选项卡并向后移动时,其状态与离开时相同?

了解碎片生命周期https://developer.android.com/guide/components/fragments.html#Lifecycle

具体来说,您希望将您的状态保存在saveInstanceState中,当在onCreate中重新创建片段时,您保存的内容将被发回给您

 类似资料:
  • Tabbar 底部导航栏 1.4.8 优点: 此组件一般用于应用的底部导航,具有如下特点: 可以设置凸起的按钮,且是全端通用的 图标可以使用字体图标(内置图标和扩展图标)或者图片 可以动态切换菜单的数量以及配置 切换菜单之前,可以进行回调鉴权 可以设置角标 有效防止组件区域高度塌陷,无需给父元素额外的内边距或者外边距来避开导航的区域 缺点: 虽然优点很多,但是如果用此组件模拟tabbar页面的话依

  • 本文向大家介绍Android使用BottomNavigationBar实现底部导航栏,包括了Android使用BottomNavigationBar实现底部导航栏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现底部导航栏的具体代码,供大家参考,具体内容如下 展示 MODE_FIXED+BACKGROUND_STYLE_STATIC效果 DE_FIXED+BACKGR

  • 本文向大家介绍使用Fragment+ViewPager实现底部导航栏,包括了使用Fragment+ViewPager实现底部导航栏的使用技巧和注意事项,需要的朋友参考一下 前几天准备写一个小程序,一直认为fragment实现底部导航栏,是很容易的事情,可是却遇到了前所未有的问题,先给大家贴出来我出错的界面布局代码: 这个布局实现的效果如下: 只看效果,大家觉得挺好的,但是重要的问题来了。 下面的r

  • 本文向大家介绍Flutter实现底部导航栏,包括了Flutter实现底部导航栏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Flutter实现底部导航栏的具体代码,供大家参考,具体内容如下 效果 实现 先将自动生成的main.dart里面的代码删除, 创建app.dart作为首页的页面文件 创建today.dart、kb.dart、playground.dart三个页面文件作为ta

  • 本文向大家介绍android实现底部导航栏,包括了android实现底部导航栏的使用技巧和注意事项,需要的朋友参考一下 底部导航栏我选择用FragmentTabHost+Fragment来实现,这个方法比较好用,代码量也不多 首先是开始的activity_main.xml 也可以直接在xml文件里面写 这xml文件就一个view加一个tab  view用来显示碎片,tab用来放置底部按钮的数量 再

  • 我创建了一个带有底部导航栏的活动。我在谷歌上搜索了很多关于它的信息,但现在我不知道如何准确地处理这个问题。之前,当用户点击底部导航时,我刚刚开始了另一个活动,但我认为这不好。 如何在选项卡之间切换?我必须处理碎片吗?那么“setContentView(int layoutResID)”呢?我该怎么做?我很困惑。。。 非常感谢你的帮助——我希望你明白我的意思。