Anko忽略在样式中定义的layout_margin

时间:2017-04-14 02:16:23

标签: android kotlin android-styles anko

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

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

2 个答案:

答案 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