Anko忽略了在样式中定义的layout_margin

我创建了一个自定义样式:

<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函数定义一个预定义的保证金吗?

这不是Anko问题,这是Android的工作原理:

如果您在自定义样式中指定了layout_margin,则此样式必须明确应用于您希望具有指定边距的每个单独视图(如下面的代码示例所示)。 将此样式包含在主题中并将其应用于您的应用程序或某个活动将不起作用。

这是因为以layout_开始的属性是LayoutParams ,或者在本例中是MarginLayoutParams 。 每个ViewGroup都有自己的LayoutParams实现。 所以layout_margin不只是可以应用于任何地方的通用属性。 必须在ViewGroup的上下文中应用,将其明确定义为有效的参数。

在这里寻找更多。

正如@John在他的回答中指出的,使用样式不是定义布局参数的选项。

所以,我开发了一个函数,在applyRecursively中使用,遍历视图并应用我想要应用的布局。

解决方案:

我想为宽度和高度定义matchParent,为TableView定义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