我是相当新的android工作室,任何帮助将不胜感激。
我在MainActivity中通过编程设置了一个底部导航栏——用其他片段设置它的最佳方式是什么。我有三个片段,导航栏中的每个选项卡一个片段,其他片段可以在按下导航栏片段中的按钮时打开。我在哪里设置这些其他片段?在连接到导航栏的片段的同一活动中,或在不同活动中。
如何保存显示片段的当前状态,以便当我移动到不同的选项卡并返回时,它将处于与我离开时相同的状态?
我想扩展@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多年的虫子,而且不是很直观;但是一旦你习惯了,你就可以“使用它”。
我的问题是,我在哪里设置这些其他片段?在连接到导航栏的片段的同一活动中,或在不同活动中。
这实际上取决于您以及您想如何显示片段。您可以在同一活动中显示它们,也可以打开另一个活动。但是,请记住,如果打开另一个活动,您将丢失上一个活动的导航栏(一个活动始终使用整个屏幕)
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)”呢?我该怎么做?我很困惑。。。 非常感谢你的帮助——我希望你明白我的意思。