AppBarLayout的style定义在Widget.Design.AppBarLayout
再进一步可以找到elevation的高度是design_appbar_elevatio
因此只要在自己项目的dimens中重写这个值即可
0dp
一开始因为定义太多,搞不清楚,妈的
大致流程是这样的:
1 个参数的调用 2 个参数的,2 调 3,3 调 4
,然后我们就只用在 4 个参数的构造方法里面 init 就可以了。(但 kotlin 貌似继承完直接在init下写东西就完事了。)src/value下新建一个 attr 文件,然后定义一些属性,然后在 init 里面获取就 OK 了。
其实分类可以分为两类:
自定义 view
是广义的,理解为自定义控件)另外根据自定义方式可以分为三大类:
setTextColor(Int int)
函数就行了。getWidth
/width
是拿不到的,只有在 onMeasure
方法后面通过 getMeasuredWdith
获取。如果必须在 init 中取得,那…其实也看情况,比如我需要获取 recyclerview 的itemview 的宽度,这时候 recyclerview 都还没onMeasure,你获取啥宽度都是 0,(然后我剑走偏锋,想直接在 init 里面调用 onMeasure(),发现需要传父布局给的参数...参数带一个标识和一个表示大小的数值,放弃了)。
recycler_view_fgd.outlineProvider = object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
outline.setRoundRect(0, 0, view.width / titles.size, view.height, layoutRadius)
}
}
直接调用view.width
即可。
或者呢如果是监听事件需要,设置全部变量,然后在 onMeasure()
里面初始化。
#6. 屏幕适配
由于 API 26 及以上的 Activity#getResources()#getDisplayMetrics() 和 Application#getResources()#getDisplayMetrics() 是不同的引用,所以在 API 26 及以上适配是没有影响的,但在 API 26 以下 Activity#getResources()#getDisplayMetrics() 和Application#getResources()#getDisplayMetrics() 是相同的引用,导致适配有问题。
一开始我是这么写的,错了
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
if (p0.toString().trim().isNotEmpty())
clear_search.visibility = View.VISIBLE
else
clear_search.visibility = View.INVISIBLE
}
发现输入空格也会出现,是因为kotlin默认允许null值toString(),并且返回“null”
解决方法:前面加个判断或者使用RxBinding,见下文。
Preference
-> Editor
-> Code Style
-> kotlin
-> Wrapping and braces
-> Keep when reformatting
取消勾选 Line breaks
,会看见右边模拟代码出会有这次修改产生的效果。
与Keep when reformatting
同一级的、在其上方可以看见 Hard wrap at
,意思是一行达到这个字数就强制换行,可以修改成想要的字数,默认是default<==>100。
DecodeFormat.PREFER_RGB_565
配合into配合鲁班压缩配合jpg。GlideApp.with(context).load("file:///android_asset/weird/$position.png").into(img)
DecodeFormat.PREFER_RGB_565
就差不多了。但是Glide一直提示Glide treats LayoutParams.WRAP_CONTENT as a request for an image the size of this device's screen dimensions. If you want to load the original image and are ok with the corresponding memory cost and OOMs (depending on the input size), use override(Target.SIZE_ORIGINAL). Otherwise, use LayoutParams.MATCH_PARENT, set layout_width and layout_height to fixed dimension, or use .override() with fixed dimensions.
,没办法,只能不管了,显示没问题。* 横竖屏切换的生命周期
```
WelcomeActivity:onCreate
WelcomeActivity:onStart
WelcomeActivity:onResume
WelcomeActivity:onPause
WelcomeActivity:onResume
WelcomeActivity:onConfigurationChanged
WelcomeActivity:onPause
```
没有一个好用的框架,适合自己的只有自己写的,干。
首先使用的时候按照大家喜闻乐见的方式调用,取消的话就直接call.cancel()
,但偶然发现tmd这个所谓动态代理模式
完成的Retrofit为了解耦,cancel()是不能及时让回调知道的。
上面说的简直不是人话,行业陋习,能简单解释清楚的非要整一堆术语。
其实就是callback
里的回调方法在判断call!!.isCanceled()
的时候不及时,cancel了还是返回false,也就是没有被取消。
心路历程
首先是测试在aActivity发请求,这时候由于某种问题直接跳转到bActivity然后finish aActivity,并且a的onDestory调用了call?.cancel(),但callback的回调会依然执行,并且,在已经与服务器建立连接的情况下会默认调用onFailure()
,那假如我在失败的回调中有UI处理,或者只是简单的非Application
级别的Toast
,APP直接FC
⬇️
然后我分别在回调中判断call!!.isCanceled()
发现还是不行,一直返回false
⬇️
然后看见
ok,在onFailure()的回调中加上判断,继续,还是不行,调试发现message为socketClosed
⬇️
继续研究发现,没建立连接消息为canceled,建立后canceled直接会socketClosed,那我要判断socketClosed作为取消的条件吗?不对
分析需要的状态(比如下载文件):
下载完成
)下载失败请重试
)取消下载
)但是别忘了,没有网络或者网络错误也是会有socketClosed消息并且走onFailure()
瞬间想骂娘。
然后看见有自定义CallBack的,自定义Call的,想了想,还tm不如不用了。
但是权衡之后感觉,配合rx应该还行,所以还是没得出一个比较好的结论。
无论是怎么创建的,都是onCreateView -> onViewCreated -> onActivityCreated 这个顺序。
Window布局:Window>DecorView>ContentView
属性名称 | 作用 |
---|---|
windowIsFloating |
自定义dialog中match_parent 属性无效,因为默认此属性为true,会直接设置window的宽高为wrap_content |
windowFrame |
带不带默认dialog的边框 |
原因是context.obtainStyledAttributes(attrs,R.styleable.xxx)
这里的attrs没写。
以获取drawable数组为例
// 获取对应的资源id,类似R.array.xxx
val resIcon = ta.getResourceId(R.styleable.MuseTabBar_tab_bar_icons, -1)
// 通过id获取资源,类似resource.getIntArray()
val iconTa = resources.obtainTypedArray(resIcon)
// 本地建立数组
val icons = IntArray(iconTa.length())
// 遍历资源
for (i in 0 until iconTa.length()) {
// 获取资源中的每个drawable id
icons[i] = iconTa.getResourceId(i, 0)
}