以编程方式创建视图后添加样式

Posted

技术标签:

【中文标题】以编程方式创建视图后添加样式【英文标题】:Add Style after creating a View programmatically 【发布时间】:2014-11-08 18:17:33 【问题描述】:

标题说明了一切,希望如此。

1) 我以编程方式创建视图:

RelativeLayout rl = new RelativeLayout(this);

2) 我想将它添加到现有的 LinearLayout,然后我想将 Style 添加到 RelativeLayout。比如:

LinearLayout ll = (LinearLayout) findViewById(R.id.MyLinearLayout);
RelativeLayout rl = new RelativeLayout(this);
ll.addView(rl);
//add Style to rl here

我找不到这样做的方法!

我知道有一些方法可以以编程方式添加样式。比如:

RelativeLayout rl = new RelativeLayout(this, null, R.style.MyRelativeLayout);

但这会在我将相对布局添加到线性布局之前添加样式。 因此,relativelayout 不是“打印”的,因为在我将它添加到 linearlayout 之前,他应该如何知道 linearlayout 是他的父级。

在创建视图并将其添加到父视图后,是否有人可以通过编程方式将样式添加到视图中?

希望你明白我的意思。

【问题讨论】:

“印刷”是什么意思? 【参考方案1】:

您无法在构建视图后应用样式。正确的做法是在 android 5.0+ 上使用 4 参数构造函数,或者创建引用您的样式的主题属性并使用 3 参数构造函数。

// Works on versions prior to Android 5.0
RelativeLayout rl = new RelativeLayout(this, null, R.attr.myRelativeLayoutStyle);

// Works on Android 5.0 and above
RelativeLayout r2 = new RelativeLayout(this, null, 0, R.style.MyRelativeLayout);

res/values/attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="myRelativeLayoutStyle" format="reference" />
    ...

res/values/styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyRelativeLayout">
        ...
    </style>
    ...

res/values/themes.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyAppTheme" parent="...">
        <item name="myRelativeLayoutStyle">@style/MyRelativeLayout</item>
        ...

【讨论】:

在哪里正确放置主题和 attrs.XML 文件?直接进入值还是我应该创建一个单独的文件夹? @alanv attrs.xml 使用哪种资源类型?我只能选择值来获取资源可访问@alanv 啊,抱歉,我忘了在路径中添加“值”。它们都应该放在 res/values 中。 我会试试 ;) @alanv【参考方案2】:

两个有用的答案。

RelativeLayout layout = (RelativeLayout)getLayoutInflater().inflate(R.layout.template, null);

int buttonStyle = R.style.your_button_style;
Button button = new Button(new ContextThemeWrapper(context, buttonStyle), null, buttonStyle).

见https://***.com/a/24438579/5093308和https://***.com/a/5488652/5093308

【讨论】:

以上是关于以编程方式创建视图后添加样式的主要内容,如果未能解决你的问题,请参考以下文章

android - 获取以编程方式创建的视图的估计高度

以编程方式创建视图和添加子视图比使用情节提要更好/更快[重复]

以编程方式创建的 UIView 的框架为 0

在以编程方式创建的 UIView 层次结构之上添加子视图

在另一个以编程方式创建的视图下方布局视图

iOS 以编程方式为表格视图单元格内容创建 NSLayoutConstraint