本来是应该为主页加载数据库数据了,但是想着做后台之前写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. Stm32CubeMx lwip+freeRTOS TCP 服务

    如何添加lwip参照上一篇   stm32CubeMx lwip + freeRTOS 今天讲一下,如何添加TCP服务 LwIP 提供了三种编程接口,分别为 RAW/Callback API.NETC ...

  2. Python--unique()与nunique()函数

    参考:https://www.cnblogs.com/xxswkl/p/11009059.html 1 unique() 统计list中的不同值时,返回的是array.它有三个参数,可分别统计不同的量 ...

  3. eclipse环境变量设置

    eclipse的运行需要java,但是当安装了多个版本的jdk后,eclipse可能就不能用了. 解决办法就是: #eclipse 文件夹下有eclipse.ini配置文件,在文件首行添加如下信息: ...

  4. html的适配

    html值得一说的应该就是适配 !!适配是与手机同时存在的 写好一个页面在手机端打开,会发现这个页面显示很小,那是因为设备的视口宽度viewport不等于设备宽度device-width,而页面是根据 ...

  5. HashMap之Hash碰撞源码解析

    转自:https://blog.csdn.net/luo_da/article/details/77507315 https://www.cnblogs.com/tongxuping/p/827619 ...

  6. validate表单验证-单独验证

    今天编写一个表单验证程序,我来说一下今天遇到的坑:程序不是通过submit按钮提交验证的,是在自己写的一个方法中提交的,出现了表单无法验证的情况.然后我就了解了一下jquery validate的验证 ...

  7. Java If ... Else

    章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...

  8. 讨论(xia che ≖‿≖✧)magic number——1000000007

    为什么要对1000000007取模(取余) 来看这篇博客的基本上都是和我一样脑子有坑的人,要么就是看了我某篇大数阶乘,大数的排列组合等类似博客被忽悠过来的.我刚刚说到那些类型的题目一般都要求将输出结果 ...

  9. JQuery 动画实现

    $(this.div_wrong).show().css({width:"0px", height:"0px"})    .animate({width:&qu ...

  10. mysql怎么查看当前登录用户

    mysql> select user();+----------------+| user()         |+----------------+| root@localhost |+--- ...