anko写可重用的style
问题
安卓使用xml布局时,
style是省略大部分代码的一个工具,
然而转向anko后发现并没有这么容易了.
anko不再支持style这样的写法.
方案
anko有apply函数和applyRecursively函数.
可以作为style的备用实现方案
目标
- 能影响外观
- 能像原先一样继承
实现
变化
- xml中是定义式编程,而使用anko来实现是函数式编程,需要转换一些写法
- kotlin特有的类型判断以及类似rust的类型判断后对类型的隐式转换大有用途
- 要发挥applyRecursively的特长,把原来一些组合使用Label,content的style放在一处
举例
1 | // 继承举例 |
anko中一些效果的新写法
类别 | 写法 |
---|---|
width | view.width = view.dip(90) |
gravity | view.gravity = Gravity.END // 用end代替了right |
textColor | view.textColor = ContextCompat.getColor(view.context, R.color.textPrimary) |
textSize | view.textSize = 24f // anko的textSize自动选择了sp作为单位 |
width | view.layoutParams.width = matchParent |
height | view.layoutParams.height = wrapContent |
15dp | view.dip(15) |
15sp | view.sp(15) // 写是可以写但不用 |
padding | view.horizontalPadding = view.dip(15) // 对称时,anko可以用一个横向padding代替左右 |
textStyle | view.setTypeface(null, Typeface.BOLD) |
background | view.setBackgroundResource(R.drawable.out~framebackground~) |
inputType | view.inputType = InputType.TYPE~CLASSNUMBER~ |
maxLength | view.filters += InputFilter.LengthFilter(4) // 注意是加等于 |
imeOptions | view.imeOptions = EditorInfo.IME~ACTIONDONE~ |
selectAllOnFocus | view.setSelectAllOnFocus(true) |
nextFocusForwardId | view.nextFocusForwardId = R.id.package~s~ |
digit | keyListener = DigitsKeyListener.getInstance(“0123456789.”) |