我正在尝试使用应该完全相同的自定义复合视图替换一组视图。具体来说,我经常重复以下布局:
<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的布局参数丢失了。我做错了什么,还是需要解决方法?
答案 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
一起使用,但是可以与padding
,background
等一起使用。
答案 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) {
...
}
。