如何在合并的自定义android视图上维护布局属性?

时间:2013-02-09 12:36:39

标签: android android-layout android-view android-xml

我正在尝试使用应该完全相同的自定义复合视图替换一组视图。具体来说,我经常重复以下布局:

<LinearLayout style="@style/customLayoutStyle">
  <Button style="@style/customButtonStyle" />
  <TextView style="@style/customTextViewStyle" />
</LinearLayout>

我的目标是用一个<Highlighter />替换此块。

为此,我在res / layout / highlighter.xml中定义类似

的内容
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/customLayoutStyle">
    <Button android:id="@+id/btnHighlighter" style="@style/customButtonStyle" />
    <TextView android:id="@+id/lblHighlighter" style="@style/customTextViewStyle" />    
</merge>

在我的自定义视图中,我有类似

的内容
public class Highlighter extends LinearLayout {
    public Highlighter(Context context, AttributeSet attrs) {
        super(context, attrs);
        inflate(context, R.layout.highlighter, this);
    }
}

这大部分都有效,但似乎忽略了<merge>标记的某些布局参数。这个screenshot说明了什么似乎是错误的。底部行的3个图像正确对齐,使用3x我想要替换的LinearLayout块。只有左上角的图像才使用自定义视图。我的猜测是padding和layout_weight的布局参数丢失了。我做错了什么,还是需要解决方法?

2 个答案:

答案 0 :(得分:2)

几年后,这在Android上仍然很复杂,但是可以做到。

您可以通过在自定义视图中使用style属性,然后在主题中设置样式来实现。

不要在res/layout/highlighter.xml中设置样式:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <Button android:id="@+id/btnHighlighter" style="@style/customButtonStyle" />
    <TextView android:id="@+id/lblHighlighter" style="@style/customTextViewStyle" />    
</merge>

然后在您的自定义视图中:

public class Highlighter extends LinearLayout {
    public Highlighter(Context context, AttributeSet attrs) {
        // The third constructor parameter is you friend
        super(context, attrs, R.attr.highlighterStyle);
        inflate(context, R.layout.highlighter, this);
    }
}

values/attrs_highlighter_view.xml中定义属性:

<resources>
    <attr name="highlighterStyle" format="reference" />
</resources>

现在您可以在主题中设置样式

<style name="YourAppTheme" parent="Theme.AppCompat">
    <item name="preferenceViewStyle">@style/customLayoutStyle</item>
</style>

这种方式将在您每次使用Highlighter时默认使用。

然后使用您的自定义视图:

<com.your.app.Highlighter
    android:id="@+id/highlighter"
    ... />

我尚未验证它是否可以与layout_weight一起使用,但是可以与paddingbackground等一起使用。

答案 1 :(得分:0)

详细说明 muscardinus' answer,从 API 21 (Lollipop) 开始,$ date_var="00:20:40.28"; $ date +'%s.%3N' -d "1970-01-01 $date_var" --utc 1240.280 接受 View 作为第四个构造函数参数,因此您可以跳过 defStyleRes 部分,只需做:

在styles.xml中

attr

自定义视图.kt

<style name="CustomView">
    // Define your style here
</style>

请注意,您至少需要 class CustomView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, ) : LinearLayout(context, attrs, defStyleAttr, R.style.CustomView) { ... }