我创建了一个自定义样式:
<style name="Static">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginEnd">5dp</item>
</style>
然后我用静态函数扩展了anko:
inline fun ViewManager.static(theme: Int = R.style.Static, init: TextView.() -> Unit) = ankoView(::TextView, theme, init)
当我在布局中使用它时:
static { text = resources.getString(R.string.name) }
marginEnd值被忽略。
如果我在anko中手动添加保证金:
static { text = resources.getString(R.string.name) }.lparams { marginEnd = dip(5) }
保证金很好。
你们是否知道anko正在忽略我的保证金价值或其他任何方式为扩展视图anko函数定义预定义保证金?
答案 0 :(得分:3)
这不是Anko问题,这就是Android的工作原理:
如果要在自定义样式中指定layout_margin,则必须将此样式显式应用于您希望具有指定边距的每个单独视图(如下面的代码示例所示)。在主题中包含此样式并将其应用于您的应用程序或活动将不起作用。
这是因为以layout_开头的属性为LayoutParams
,或者在此示例中为MarginLayoutParams
。每个ViewGroup
都有自己的LayoutParams
实施。因此layout_margin
不仅可以在任何地方应用的一般属性。它必须在ViewGroup
的上下文中应用,并将其明确定义为有效参数。
再看here。
答案 1 :(得分:1)
@John在他的回答中指出,使用样式不是定义布局参数的选项。
因此,我开发了一个在applyRecursively中使用的函数,它迭代视图并应用我想要应用的布局。
解决方案:
我想为TableView定义宽度和高度的matchParent以及16dp的边距,所以我创建了一个扩展TableLayout的新类
class TableViewFrame(context: Context) : TableLayout(context)
然后在视图是TableViewFrame的函数中我应用我的布局
fun applyTemplateViewLayouts(view: View) {
when(view) {
is TableViewFrame -> {
when(view.layoutParams) {
is LinearLayout.LayoutParams -> {
view.layoutParams.height = matchParent
view.layoutParams.width = matchParent
(view.layoutParams as LinearLayout.LayoutParams).margin = view.dip(16)
}
}
}
}
}
要使用该函数,在视图定义中,我只需在applyRecursively中传递它:
verticalLayout {
tableViewFrame {
tableRow {
...
}
}
}
}.applyRecursively { view -> applyTemplateViewLayouts(view) }
我在媒体上写了一篇文章,附有更详细的解释:https://medium.com/@jonathanrafaelzanella/using-android-styles-with-anko-e3d5341dd5b4