本来是应该为主页加载数据库数据了,但是想着做后台之前写jsp后台写吐了,所以先拖几天。把之前的代码完善一下,或者添加些新内容。

......

多个fragment切换卡顿

首先修正一个bug。从主页切换到别的页面,再返回主页,耗时很长。原因是之前响应bottombar点击事件切换Fragment,使用的是transAction.replace方法。我的理解是这样,replace会先执行remove,移除之前的fragment;再执行add方法,添加需要添加的Fragment。所以每次replace的时候,都要重新创建一个Fragment实例。那解决办法是直接使用add方法

transAction.add在不移除被覆盖的Fragment的同时,把新的Fragment覆盖在上面

所以尝试直接把replace换成add

val transAction = supportFragmentManager.beginTransaction()
// transAction.replace(R.id.contentContainer,FragmentManage.fragmentManage.getFragment(it)!!,it.toString())
transAction.add(R.id.contentContainer,FragmentManage.fragmentManage.getFragment(it)!!)
transAction.commit()

运行一开始,后面fragment的内容会叠加到前面fragment上面

多次点击切换同一个fragment时会报错,java.lang.IllegalStateException: Fragment already added:

说是fragment已经被添加,那应该是一个fragment添加一次,就在内存中被保存起来了,继续添加其他的fragment不会影响之前的fragment在其他内存中的状态

所以要加个判断fragment.Added,如果已经添加过,那就只要调用fragment.show就好了,同时使用hide方法把显示的fragment隐藏起来

最后修改成这样

private var targetFragment:BaseFragment?=null
private var currentFragment:BaseFragment?=null override fun initData() {
bottomBar.setOnTabSelectListener {
//it即是tab的id
// println(it)
val transAction = supportFragmentManager.beginTransaction()
//transAction.replace(R.id.contentContainer,FragmentManage.fragmentManage.getFragment(it)!!,it.toString())
targetFragment=FragmentManage.fragmentManage.getFragment(it)!!
if(targetFragment!!.isAdded) {
transAction.hide(currentFragment!!)
transAction.show(targetFragment!!)
transAction.commit()
currentFragment=targetFragment
}else{
if(currentFragment!=null) {
transAction.hide(currentFragment!!)
}
transAction.add(R.id.contentContainer, targetFragment!!)
transAction.commit()
currentFragment= targetFragment!!
} }
}

这样就可以了。更详细的内容可以参考这个Android解决多个fragment来回切换时布局重新实例化问题

设置状态栏透明 statusBar

状态栏指的就是这个吧

参考的是这篇文章android透明状态栏——你要的只是几个方法

在android 4.4之后使用下面这段代码可以实现(我这模拟器android版本是5.1)

fun makeStatusBarTransparent(activity: Activity) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
var window: Window = activity.getWindow()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
var option:Int = window.getDecorView().getSystemUiVisibility() or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
window.getDecorView().setSystemUiVisibility(option);
window.setStatusBarColor(Color.TRANSPARENT);
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}

效果

有个问题,我这里设置了NoActionbar主题AppTheme,如果在AppTheme中设置别的actionbar样式,那actionbar的位置是不会变的。但是如果是在布局文件中自定义的Actionbar(我试的是toolbar),那Actionbar就会和状态栏重合。

为了理解这个程序先补充一点知识

·DecorView(activity窗口的根视图)

Android DecorView学习

DecorView是PhoneWindow的一个实例,分为两个部分Actionbar和ContentParent,我们在activity通过setContentView设置的是ContentParent,通过getWindow获得PhoneWindow对象

一些方法

window.getDecorView()获得它的DecorView

window.getDecorView.getWindowVisibleDisplayFrame(rect)获得显示区域尺寸信息。据说这样不包含状态栏,但是我模拟器上测试状态栏也包含进去了,跟windowManager.defaultDisplay.getRectSize(rect2)返回结果是一样

那为了获得状态栏的高度可以使用

var resourceId=resources.getIdentifier("status_bar_height","dimen","android")
var height=resources.getDimensionPixelSize(resourceId)

SystemUI Flag

SystemUI Flag详解及使用情景

改变状态栏颜色

if(Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT){
return
}else{
var window=this.window
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor=Color.BLUE
}
效果

尝试用kotlin做一个app(四)的更多相关文章

  1. 尝试用kotlin做一个app(写在前面)

    学kotlin的目的好像就是做一个app,不一定有什么想做的项目,只是单纯想掌握这一门技术,确切地说只是单纯想学会做app.对于概念的东西,我也没兴趣深究,用得到的学一下,用不到的,就算了.我也不知道 ...

  2. 尝试用kotlin做一个app(二)

    导航条 我想实现的效果是这样的 类似于ViewPager的效果,子类导航页面可以滑动,当滑动某个子类导航页面,导航线会平滑地向父类导航移动 ·添加布局 <!--导航分类:编程语言/技术文档/源码 ...

  3. 尝试用kotlin做一个app(五)

    JSP后台管理系统 开发工具是IntelliJ IDEA+tomcat+mysql5.6.19+mysql-connector-java-5.1.48.jar+easyui+kindeditor 之前 ...

  4. 尝试用kotlin做一个app(三)

    新闻列表 添加新闻列表可以使用RecyclerView.但是有个问题,RecyclerView只会在内部滚动,不会带动整个屏幕滚动.所以在原根布局外层添加androidx.core.widget.Ne ...

  5. 尝试用kotlin做一个app(一)

    1.先添加一下anko库 依赖:implementation "org.jetbrains.anko:anko:$anko_version" 版本:ext.anko_version ...

  6. 涨姿势:创业做一个App需要花多少钱(8个人,6个月,就要100万,附笔记心得)

    (原标题:涨姿势:创业做一个App要花多少钱?) 作为互联网从业者,被外行的朋友们问及最多的问题是,“做一个网站需要多少钱?”或者“做一个APP需要多少钱?”. 作为做过完整网站项目和APP的人,今天 ...

  7. 创业成本?亲身经历告诉你做一个app要多少钱

    导语:作为一名苦逼的移动互联网创业者,被外行的朋友们问及最多的问题是“做一个网站需要多少钱?”或者“做一个APP需要多少钱?” 作为一名苦逼的移动互联网创业者,被外行的朋友们问及最多的问题是“做一个网 ...

  8. 做一个 App 前需要考虑的几件事

    做一个 App 前需要考虑的几件事  来源:limboy的博客   随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

  9. 做一个App前需要考虑的几件事

    本文转载于文章原文链接,版本归原作者所有! 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 App 有了一定规模后, ...

随机推荐

  1. 分享一款免费的工控组态软件(PCHMI)

    PCHMI严格的讲它并不是一款组态软件,也不是一款SCADA软件,而是一个基于.NET构架的DLL文件,开发者可以使用微软的Visual Studio将PCHMI.DLL加载到工具箱里面进行二次开发. ...

  2. IDEA自用插件,驼峰插件,MyBatis插件,Lombok插件

    IDEA自用插件 驼峰插件:CamelCase,Shift + Alt + u快速切换驼峰 MyBatisX插件:快速在mapper之间跳转 Lombok插件:注解实现get.set方法 MyBati ...

  3. Easy_Re

    这题比较简单,一波常规的操作之后直接上ida(小白的常规操作在以前的博客里都有所以这里不在赘述了),ida打开之后查看一下, 这里应该就是一个入口点了,接着搜索flag字符串, 上面的黄色的部分转换成 ...

  4. 数学软件实训2-MATLAB程序综合设计及应用

    数学软件实训任务二 一 题目:MATLAB程序综合设计及应用 二 目的:熟练掌握MATLAB程序设计的基本方法,会根据MATLAB程序设计的 三 要求: 1 熟练掌握控制流的基本语法结构. 2 会熟练 ...

  5. Java虚拟机03(Java虚拟机内存模型)

    根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 其实最需要Java程序员关注的是堆,栈,还有方法区,因为啊: 如果代码又问题的话,可能回出现栈溢出 然后说 ...

  6. 从0开始自己配置一个vps虚拟服务器(3)

    安装数据库mysql,因为这个服务器比较烂,我只能装低版本的数据库.尝试了很多遍,终于装上去了,高版本应该没那么麻烦. 我安装了很多遍,下载的安装包,都没有安装成功. mysql各版本安装地址: (我 ...

  7. POJ 1905:Expanding Rods 求函数的二分

    Expanding Rods Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13780   Accepted: 3563 D ...

  8. 19 03 13 关于 scrapy 框架的 对环球网的整体爬取(存储于 mongodb 数据库里)

    关于  spinder  在这个框架里面   和不用数据库  相同 # -*- coding: utf-8 -*- import scrapy from yang_guan.items import ...

  9. 【LeetCode】最小栈

    [问题] 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈 ...

  10. Vulkan 之 Debugging

    1.可以用validation layers 进行验证: 2.Snapdragon Profiler 使用说明