我有自定义视图,我只想访问layout_height
的xml布局值。
我目前正在获取该信息并在onMeasure期间存储它,但这仅在首次绘制视图时才会发生。我的视图是XY图,它需要尽早知道它的高度,以便它可以开始执行计算。
视图位于viewFlipper布局的第四页上,因此用户可能暂时不会翻转它,但是当它们翻转到它时,我希望视图已经包含数据,这需要我有进行计算的高度。
感谢!!!
答案 0 :(得分:12)
工作:)...你需要改变" android" for" http://schemas.android.com/apk/res/android"
public CustomView(final Context context, AttributeSet attrs) {
super(context, attrs);
String height = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "layout_height");
//further logic of your choice..
}
答案 1 :(得分:4)
来自公共视图(上下文上下文,AttributeSet attrs)构造函数文档:
何时调用的构造函数 从XML中扩展视图。这是 在视图出现时调用 从XML文件构造, 提供属性 在XML文件中指定。
为了达到你所需要的,为你的自定义视图提供一个构造函数,它将Attributes作为参数,即:
public CustomView(final Context context, AttributeSet attrs) {
super(context, attrs);
String height = attrs.getAttributeValue("android", "layout_height");
//further logic of your choice..
}
答案 2 :(得分:4)
您可以使用:
public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
int[] systemAttrs = {android.R.attr.layout_height};
TypedArray a = context.obtainStyledAttributes(attrs, systemAttrs);
int height = a.getDimensionPixelSize(0, ViewGroup.LayoutParams.WRAP_CONTENT);
a.recycle();
}
答案 3 :(得分:0)
针对该问题的答案并未完全涵盖该问题。实际上,他们正在彼此完成。总结一下答案,首先我们应该检查getAttributeValue
的返回值,然后如果将layout_height
定义为维度值,请使用getDimensionPixelSize
进行检索:
val layoutHeight = attrs?.getAttributeValue("http://schemas.android.com/apk/res/android", "layout_height")
var height = 0
when {
layoutHeight.equals(ViewGroup.LayoutParams.MATCH_PARENT.toString()) ->
height = ViewGroup.LayoutParams.MATCH_PARENT
layoutHeight.equals(ViewGroup.LayoutParams.WRAP_CONTENT.toString()) ->
height = ViewGroup.LayoutParams.WRAP_CONTENT
else -> context.obtainStyledAttributes(attrs, intArrayOf(android.R.attr.layout_height)).apply {
height = getDimensionPixelSize(0, ViewGroup.LayoutParams.WRAP_CONTENT)
recycle()
}
}
// Further to do something with `height`:
when (height) {
ViewGroup.LayoutParams.MATCH_PARENT -> {
// defined as `MATCH_PARENT`
}
ViewGroup.LayoutParams.WRAP_CONTENT -> {
// defined as `WRAP_CONTENT`
}
in 0 until Int.MAX_VALUE -> {
// defined as dimension values (here in pixels)
}
}