AndroidApp首页主流框架搭建
DrawerLayoutNavigationViewToolbarViewPagerBottomNavigationView效果
页面结构解析
这是一个比较常见的APP首页的结构,侧边栏主页,侧边栏里是一些菜单,主页由底部菜单控制内容区,内容区是可滑动的子页面。整体比较舒服合理,各自为阵,却又能关联在一起,加上又是大众喜爱的MaterialDesign风格,所以成为了当下APP首页的主流结构。
上图是做的一个简单的思维导图,并不复杂,理清了结构就能事半功倍。页面布局1。首页
即整个大的容器。
lt;?xmlversion1。0encodingutf8?includelayoutlayoutappbarmainandroid:layoutwidthmatchparentandroid:layoutheightmatchparentcom。google。android。material。navigation。NavigationViewandroid:ididnavviewandroid:layoutwidthwrapcontentandroid:layoutheightmatchparentandroid:layoutgravitystartandroid:fitsSystemWindowstrueapp:headerLayoutlayoutnavheadermainapp:menumenuactivitymaindrawerandroidx。drawerlayout。widget。DrawerLayout
DrawerLayout包裹着include的主页和侧边栏内容NavigationView。appbarmain是主页内容,采用include的方式引用是为了结构清晰,避免混乱。侧边栏NavigationView分为头部布局headerLayout和菜单menu,注意一个是layout一个是menu。其他需要注意的是,NavigationView的位置应与主内容appbarmain同级,且在主内容之后。关于DrawerLayout更多使用可以查看:DrawerLayout使用详解。2。主页
这里主页说的是首页除侧边栏以外的页面。
lt;?xmlversion1。0encodingutf8?com。google。android。material。appbar。AppBarLayoutandroid:layoutwidthmatchparentandroid:layoutheightwrapcontentandroid:themestyleAppTheme。AppBarOverlaycom。google。android。material。appbar。AppBarLayoutincludelayoutlayoutcontentmaincom。google。android。material。floatingactionbutton。FloatingActionButtonandroid:ididfabandroid:layoutwidthwrapcontentandroid:layoutheightwrapcontentandroid:layoutgravitybottomendandroid:layoutmarginRightdimendp20android:layoutmarginEnddimendp20android:layoutmarginBottomdimendp70app:srcCompatandroid:drawableicdialogemailandroidx。coordinatorlayout。widget。CoordinatorLayout
上面是标题,中间是内容区,FloatingActionButton可以忽略。3。主页内容区
效果同2一样
lt;?xmlversion1。0encodingutf8?LinearLayoutandroid:layoutwidthmatchparentandroid:layoutheightmatchparentandroid:orientationverticalcom。google。android。material。bottomnavigation。BottomNavigationViewandroid:ididbottomnavigationandroid:layoutwidthmatchparentandroid:layoutheightwrapcontentandroid:layoutmarginTop8dpandroid:background?android:attrwindowBackgroundapp:layoutconstraintBottomtoTopOfidviewPagerapp:menumenubottomnavigationLinearLayoutandroidx。constraintlayout。widget。ConstraintLayout
上面是ViewPager,可滑动的内容区,填充一个一个的Fragment子页面。下面是BottomNavigationView底部菜单,与上面的ViewPager关联。
到此页面布局的部分介绍完毕,下面开始说代码部分。代码部分1。侧边栏
我们要在toolbar上加一个按钮,把侧边栏关联起来,让其点击可以弹出侧边栏。
Drawer关联ToolbarprivatefuninitActionBarDrawer(){valtoggleActionBarDrawerToggle(this,drawerlayout,toolbar,R。string。navigationdraweropen,R。string。navigationdrawerclose)drawerlayout。addDrawerListener(toggle)toggle。syncState()}2。内容区
关联了侧边栏,我们来看内容区,上面说过内容区是ViewPager包含的一个个子页面Fragment,来看代码的实现
初始化FragmentprivatefuninitFragments(){valviewPagerAdapterCommonViewPagerAdapter(supportFragmentManager)viewPagerAdapter。addFragment(HomeFragment())viewPagerAdapter。addFragment(TreeFragment())viewPagerAdapter。addFragment(NaviFragment())viewPagerAdapter。addFragment(ProjectFragment())viewpager。offscreenPageLimit1viewpager。adapterviewPagerAdapter}
处理事件1。侧边栏点击事件侧边栏点击事件navview。setNavigationItemSelectedListener{Handlenavigationviewitemclickshere。when(it。itemId){R。id。navcollect{ToastUtilKt。showToast(收藏)}R。id。navshare{ToastUtilKt。showToast(分享)}R。id。navabout{ToastUtilKt。showToast(关于)}R。id。navlogout{ToastUtilKt。showToast(退出)}}关闭侧边栏drawerlayout。closeDrawer(GravityCompat。START)true}
根据itemId判断触发事件,并关闭侧边栏,这一步可选,也可以不关闭保持侧边栏打开的状态。2。viewpager滑动监听viewpager滑动监听viewpager。addOnPageChangeListener(object:OnPageChangeListener{overridefunonPageScrollStateChanged(state:Int){}overridefunonPageScrolled(position:Int,positionOffset:Float,positionOffsetPixels:Int){}overridefunonPageSelected(position:Int){bottomnavigation。menu。getItem(position)。isCheckedtrue设置checked为true,但是不能触发ItemSelected事件,所以滑动时也要设置一下标题when(position){0{toolbar。titleresources。getString(R。string。appname)}1{toolbar。titleresources。getString(R。string。titletree)}2{toolbar。titleresources。getString(R。string。titlenavi)}else{toolbar。titleresources。getString(R。string。titleproject)}}}})
viewpager滑动之后底部对应的菜单选中,并重新设置标题。3。bottomnavigation底部菜单点击事件bottomnavigation点击事件bottomnavigation。setOnNavigationItemSelectedListener{when(it。itemId){R。id。navigationhome{viewpager。currentItem0returnsetOnNavigationItemSelectedListenertrue}R。id。navigationtree{viewpager。currentItem1returnsetOnNavigationItemSelectedListenertrue}R。id。navigationnavi{viewpager。currentItem2returnsetOnNavigationItemSelectedListenertrue}R。id。navigationproject{viewpager。currentItem3returnsetOnNavigationItemSelectedListenertrue}}false}
底部菜单点击的时候也让viewpager滑动的响应的位置,同第2步其实是相互关联的。
到此,整个搭建就完成了,从页面布局到初始化控件,再到处理事件,整体思路要清晰,搭建起来就很快,小的功能细节再调试完善完善就ok了。完整代码https:github。comyechaoawanandroidkotlin
写作不易,有用就点个赞呗
爱的一瞬间作文500字风撕着树老人的日历,我听到它们落地时那一声声叹息。那片片的日历该是树老人的段段记忆吧?那么,在我的记忆长河中,是否也有那片片日历呢?黄昏的阴影轻轻地飘散在马路上。我在马路……
寻找那失去的信任600字作文下午,从我的房间里传来呜呜的声音,我躺在床上,泪水已经将枕头浸湿一个小时前的那一幕还在我的眼前徘徊我和小伙伴们在一起玩耍,可没多久大家就感觉有点无聊。实在忍受不了那沉闷的……
华为苹果小米价格战拉开帷幕,618手机大跳水,附上推荐清单话说618是上半年里最适合更换新手机的时间应该没人会反对吧?经过半年沉淀,各家手机厂商的旗舰产品基本发布完毕,很多平时缺货的机型,在618前后产能也稳定下来了。那么,具体……
牛市行情将持续约两年,布局首选科技股股市上涨已经一个多月,上证指数和科创板均已成功站上牛熊分界线,意味着牛市正式来临。进入6月之后,虽震荡难免,但整体上67月的行情将比5月份还强得多。预计324033……
中国人的太空航天之旅,浪漫与科技并存我国的太空航天史并不长,但是每一步都相当稳健,让我们一直看一下我国的飞船发射历史:1999年11月20日凌晨6点,神舟一号飞船发射升空,于1999年11月21日凌晨3点4……
拍卖会三年级作文今天,一节自修课上,同学们正聚精会神的做作业。忽然,一只小鸟从窗外飞了进来,把同学们吓了一大跳。还是张帆眼疾手快,挑起来一抓,可惜没抓住。我紧接着一扑,抓住了!我们在欢喜之余,……
闻泰科技子公司买下英国最大芯片制造商,美国开始使坏【文观察者网齐倩】去年7月,闻泰科技全资子公司安世半导体宣布已完成收购英国最大芯片制造商NewportWaferFab(下称NWF)的交易协议签署。但时隔近一年后,今年5月,英……
三年亏超百亿!威马汽车赴港上市,李嘉诚家族这次押对宝了?本文来源:时代财经作者:林前6月1日,威马汽车向港交所递交招股说明书,将在主板市场上市,海通国际、招银国际、中银国际为联席保荐人。这意味着,威马汽车即将成为继蔚小理之后,……
精华动物园小学作文500字汇总七篇在学习、工作乃至生活中,说到作文,大家肯定都不陌生吧,作文一定要做到主题集中,围绕同一主题作深入阐述,切忌东拉西扯,主题涣散甚至无主题。那么你有了解过作文吗?下面是小编为大家整……
彻底关闭小米手机自动更新小米手机或者红米手机在使用过程中,总是会自动更新升级系统,以至于呢造成手机经常反应慢或者卡死的现象!今天就教大家彻底关闭小米手机自动更新。首先先去系统更新页面,点击右上角……
Vivo新旗舰200W充电?小米12S入网,搭载天玑9000据爆料,Vivo新旗舰将采用200W的充电头,全线向下兼容120W、80W、66W等。早前小米官方就爆料拥有200W的充电技术,但目前商用的国内最快的是RealmeGTNeo3……
小米13和小米13Pro可能提前公布近日,小米已经定下早日发布新一代旗舰产品的规定。因此,该公司在12月举行了小米11和小米12的发布会,急于成为首批提供高通全新高端硬件平台的旗舰之一。今年很可能会延续早期发布的……