尝试用kotlin做一个app(四)
本来是应该为主页加载数据库数据了,但是想着做后台,之前写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窗口的根视图)
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
改变状态栏颜色
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(四)的更多相关文章
- 尝试用kotlin做一个app(写在前面)
学kotlin的目的好像就是做一个app,不一定有什么想做的项目,只是单纯想掌握这一门技术,确切地说只是单纯想学会做app.对于概念的东西,我也没兴趣深究,用得到的学一下,用不到的,就算了.我也不知道 ...
- 尝试用kotlin做一个app(二)
导航条 我想实现的效果是这样的 类似于ViewPager的效果,子类导航页面可以滑动,当滑动某个子类导航页面,导航线会平滑地向父类导航移动 ·添加布局 <!--导航分类:编程语言/技术文档/源码 ...
- 尝试用kotlin做一个app(五)
JSP后台管理系统 开发工具是IntelliJ IDEA+tomcat+mysql5.6.19+mysql-connector-java-5.1.48.jar+easyui+kindeditor 之前 ...
- 尝试用kotlin做一个app(三)
新闻列表 添加新闻列表可以使用RecyclerView.但是有个问题,RecyclerView只会在内部滚动,不会带动整个屏幕滚动.所以在原根布局外层添加androidx.core.widget.Ne ...
- 尝试用kotlin做一个app(一)
1.先添加一下anko库 依赖:implementation "org.jetbrains.anko:anko:$anko_version" 版本:ext.anko_version ...
- 涨姿势:创业做一个App需要花多少钱(8个人,6个月,就要100万,附笔记心得)
(原标题:涨姿势:创业做一个App要花多少钱?) 作为互联网从业者,被外行的朋友们问及最多的问题是,“做一个网站需要多少钱?”或者“做一个APP需要多少钱?”. 作为做过完整网站项目和APP的人,今天 ...
- 创业成本?亲身经历告诉你做一个app要多少钱
导语:作为一名苦逼的移动互联网创业者,被外行的朋友们问及最多的问题是“做一个网站需要多少钱?”或者“做一个APP需要多少钱?” 作为一名苦逼的移动互联网创业者,被外行的朋友们问及最多的问题是“做一个网 ...
- 做一个 App 前需要考虑的几件事
做一个 App 前需要考虑的几件事 来源:limboy的博客 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...
- 做一个App前需要考虑的几件事
本文转载于文章原文链接,版本归原作者所有! 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 App 有了一定规模后, ...
随机推荐
- NO28 第四关考试题
第4章 第4周课前测试考试题 4.1 定时任务规则的含义01 第1题 如果在某用户的crontab文件中有以下记录,该行中的命令多久执行一次(RHCE考试题)?( ) 30 4 * * 3 mycm ...
- ffmpeg 学习:001-搭建开发环境
介绍 由于命令行的ffmpeg工具无法满足产品的性能要求,需要对视频流进行兼容.所以需要调试有关的参数. FFmpeg全名是Fast Forward MPEG(Moving Picture Exper ...
- springboot自定义属性文件与bean映射注入属性值
主要有几点: 一.导入依赖 springboot的包和: <dependency> <groupId>org.springframework.boot</groupId& ...
- jmeter里面Dug Sampler 和json提取器的用法
1.编写用户详情请求 2.查看结果树 一级一级往上查找父集 3.添加json提取器 步骤:点击[用户详情]请求->添加->后置处理器->json提取器 把查看结果树里面的JSON P ...
- java 接口 2.19
接口中所有的方法都是抽象的和public的,所有的属性都是public,static,final的.
- java api 远程连接 hdfs
IDEA中新建Maven工程,添加POM依赖, 在IDE的提示中, 点击 Import Changes 等待自动下载完成相关的依赖包. <?xml version="1.0" ...
- 创建一个TCP代理
代理技术 代理一般被我们用于"穿墙",具体来说可以看这里,或者查wiki.理解代理背后的原理之后,便很容易知道,代理的作用不仅仅只是"穿墙".例如我们可以把经过 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-minus
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- Spark on Yarn | Spark,从入门到精通
?/ 为什么需要 Yarn? /? Yarn?的全称是?Yet Anther Resource Negotiator(另一种资源协商者).它作为 Hadoop?的一个组件,官方对它的定义是一个工作调度 ...
- Golang的单目(一元)运算符-地址操作符和接收操作符
Golang的单目(一元)运算符-地址操作符和接收操作符 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang的单目(一元)运算符概述 常见的地址操作符: &: ...