Anko 我遇到的坑 (应该会持续更新,PS:给自己定个小目标,然后坐等打脸)

前言

任何语言,或者说技术总有自己的坑,这可以看作是我刚刚接触 Anko 填坑的总结,也可以看成我的吐槽,如果有不对的地方,希望看到的朋友能帮我纠正,谢谢啦。

demo: Anko 练手 demo,顺便优化之前的代码布局

坑1:Anko 的代码总是无法跑对

具体描述:在前面的代码中,我在 customStyle 中设置了 TextView 对应的字体大小/颜色,然后运行的时候却发现不起作用,点击 Run 的三角按钮总是跑不对我要的效果,然后我改了颜色却发现,我现在跑的颜色是我刚刚设置的颜色。

解决:如上所示的问题,最后一句话的现象,让我瞬间明白这是 AS 的缓存问题,然后我每次跑之前都会点击下 小锤子(make project),解决。(嗯,工作之余尝试用 Anko 替换简单的布局,最好自己 checkout 到另外一个分区去,先把工作做完)

吐槽: 如果不是机智的我还记得刚刚开始使用 AS 的时候,记得 AS 有一堆坑,那么我想这个坑,几乎要让我放弃 Anko 了,这个坑我填了4天…..(ps: 是不是我 AS 的设置有问题?手动懵逼脸 -_-!)


坑2:applyRecursively(customStyle)

(ps: 这个方法是用来给 View 设置它的 style 的,就像之前在 style.xml 里面设置一样,所有的 View 都支持这个方法。)

具体描述:如上我给的链接中的 demo 中,我是将 applyRecursively 这个函数用 ScrollView 去调用了,本来我我是用第一层的 verticalLayout 调用的,但是调用之后发现,所有的 TextView 真的都统一了,包括标题栏中的 title,这明显不是需求想要的。之后我做了如下的测试:

with(ui) {
        verticalLayout {
            backgroundColor = Color.parseColor("#FFFFFF")
            relativeLayout {
                include<View>(R.layout.component_back_btn) {
                    onClick {
                    }
                }
                textView("用户协议与隐私条款") {
                    maxWidth = dip(300)
                    singleLine = true
                    textColor = Color.parseColor("#333333")
                    textSize = 20f
                }.lparams(width = wrapContent, height = wrapContent) {
                    centerInParent()
                }
                include<View>(R.layout.component_color_line)
            }.lparams(width = matchParent, height = dip(45))
            scrollView {
                verticalLayout {
                    textView(text1).applyRecursively(customStyle2)
                    textView(text2) {
                    }.lparams {
                        topMargin = dip(25)
                    }
                }.lparams(width = matchParent, height = matchParent) {
                    topMargin = dip(10)
                    horizontalMargin = dip(10)
                    bottomMargin = dip(65)
                }
            }.lparams(width = matchParent, height = matchParent)
        }
    }.applyRecursively(customStyle)

结论(ps: compile “org.jetbrains.anko:anko:0.10.0”)

  1. with(ui).applyRecursively(customStyle) 和 with(ui){ verticalLayout {}.applyRecursively(customStyle) }的调用实际上是一样的效果。

  2. 如1中调用,会覆盖内部 View 的对应的 style 属性,举个例子:

private val customStyle = { v: Any ->
        when (v) {
            is TextView -> {
                v.textSize = 14f
                v.textColor = R.color.black
            }
        }
    }

在 customStyle 中定义了 TextView 的 textSize 和 textColor,那么其包含的子 View 的 textSize 和 textColor 就都会使用这个 style 中的值,哪怕你如上使用了 :

textView("用户协议与隐私条款") {
                    maxWidth = dip(300)
                    singleLine = true
                    textColor = Color.parseColor("#333333")
                    textSize = 20f
                }.lparams(width = wrapContent, height = wrapContent) {
                    centerInParent()
                }

或者是定义了另外一个 style

private val customStyle2 = { v: Any ->
        when (v) {
            is TextView -> {
                v.textSize = 28f
                v.textColor = R.color.red
            }
        }
    }

······
textView(text1).applyRecursively(customStyle2)

其上的设置在其父 View 使用了 style 之后,都会变得无效,只会遵循父 View 的 style。

吐槽:事实上,我个人觉得这是有问题的,子 View 的 style 不应该完全有父 View 来控制,子 View 应该有一定的自由性,或许是我不够了解,坐等自己更新。


更新于 2017/6/15

在与 Anko (0.10.1)斗志斗勇了 一星期之后,我终于无奈的放弃了使用 Anko 来替代 layout,如果说 Anko 最吸引我的是它的性能,那么它的的开发效率,至少现阶段,它的开发效率让我默默地放弃了它:

  1. Anko 不支持现阶段 AS 的 preview,这是个很需要脑力的致命伤,如果说一开始秉持着对新生技术的痴迷和好奇,我不在意,毕竟,有将近3年 Android 开发的经验,只要不是太复杂的布局,我写xml 的时候基本也是写完了才去校对,但是不可否认这确实降低了开发效率。

  2. Anko layout 每次改变,都必须要重新 make project…. 如果说第一条可以让我忍受,这一条就算我想忍受也不行了,想想还有一堆活儿没干,你就会知道时间很宝贵。

  3. Anko 文档不全,基本上基础的东西 github 上确实都有了,不过再深一点的 layout 布局,例如自定义控件这些,如果你想实现自己的想法,那么你就需要在 漫漫 的 issue 大海中徜徉,而且还不一定会有。我徜徉过了,差点淹死。

  4. 至此,我打算使用 Anko 重构项目 xml 的打算也鸡飞蛋打,好在 kotlin 还是很坚挺的,虽然东西其实也挺多的,很多思维方式和 java 确实不太一样。


Anko,江湖再见!

好吧,我是个倔强的人…….(更新于 2017.6.26)

坑3:一直无法添加 recyclerView!!!!(又坑了我一个晚上….)

具体描述:在一个足够简单的列表 Activity 中,要使用 recyclerView,结果却怎么也无法引用 Anko 的 recyclerView

swipeRefreshLayout {
     setColorSchemeColors(0xE94653)
     recyclerView {
          ......          
     }
}

各种重新编译,改变版本号,最终还是不行,于是我尝试着在 build.gradle 中添加:

compile "org.jetbrains.anko:anko-recyclerview-v7:$anko_version"

然后就好了!!!!

结论: 真不是我蠢,实在是 Anko 的 ReadMe 太坑了,不信来看:

这里写图片描述

来,跟着我念:

Anko has a meta-dependency which plugs in all available features (including Commons, Layouts, SQLite) into your project at once:

dependencies {
    compile "org.jetbrains.anko:anko:$anko_version"
}

说好的,包含所有呢…… 人与人之间最重要的信任还要不要了 ~_~

结果还是要再另外导入 recyclerView 的 library,估计 cardView 这些也要这样。


更新于 2017.6.28

坑4:anko 自定义的 View 无法使用到 xml 中

具体描述:在完成了首次简单的自定义 View ( Anko demo(二) :CustomView 首次尝试) 之后发现的坑,Anko 是完全兼容并支持 xml 的,换句话说,你可以用 Anko 来调用 xml,例如 include,但是 使用 Anko 自定义出来的 View 却是无法在 xml 中使用的,至少我现在得出来的结论是这样的,如果错了,希望有更深入研究的朋友来告诉我。

我们都知道要自定义一个可以在 xml 中使用的 View,需要实现如下的方法:

public CustomView(Context context) {
    this(context, null);
}

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs);
}

但是 ankoView 的实现,却并不支持 xml 属性的构造方法:

public inline fun <T : android.view.View> android.view.ViewManager.ankoView(factory: (android.content.Context) -> T, theme: kotlin.Int, init: T.() -> kotlin.Unit): T { /* compiled code */ }

是的在 package org.jetbrains.anko.custom 就只有这一个声明…..

更新于 2017.8.2

坑5:关于 kotlin / anko 混淆打包

具体描述:经历了很长时间 kotlin 的使用,慢慢也习惯了 kotlin 的使用,anko 依然是个坑,今天在打 release 包的时候,出来了一些莫名奇妙的错误,嗯,真的是莫名奇妙,各种奇葩的 Exception,虽然从混淆过的 log 中看不出太多,但是依然准确定位到是 kotlin 类的问题,然后去 github 寻找 kotlin/anko 的混淆配置,然而啥都没有…..

解决:其实最终也没能找到比较官方的解决方式,幸好我开发的每一天都给自己来一支“机智糖浆”(ps: 手动滑稽),具体而言就是,我把所有 kotlin / anko 的相关代码,也就是 类,都放在同一个包下,没图我说个几波

这里写图片描述

然后,我在混淆文件里面把它们给屏蔽了:

这里写图片描述

就是酱紫,OK了。是不是感觉这样很 low,嗯,不过前面还有个视频压缩的功能等着我,你懂的。况且我现在的 app 是用第三方加固工具来加固的,安全方面,我也不担心。混淆纯粹是为了减少 apk 的体积。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值