Android 如何从自定义视图中访问布局高度?
我有一个自定义视图,我只想访问xml布局值Android 如何从自定义视图中访问布局高度?,android,android-layout,layout,custom-view,Android,Android Layout,Layout,Custom View,我有一个自定义视图,我只想访问xml布局值layout\u height 我目前正在获取这些信息,并在onMeasure期间存储这些信息,但只有在首次绘制视图时才会发生这种情况。我的视图是XY图,它需要尽早知道其高度,以便开始执行计算 该视图位于viewFlipper布局的第四页,因此用户可能暂时不会翻转到该视图,但当他们翻转到该视图时,我希望该视图已经包含数据,这要求我具有进行计算的高度 谢谢 来自公共视图(上下文、属性集属性)构造函数文档: 当 从XML扩展视图。这是 在创建视图时调用 从X
layout\u height
我目前正在获取这些信息,并在onMeasure期间存储这些信息,但只有在首次绘制视图时才会发生这种情况。我的视图是XY图,它需要尽早知道其高度,以便开始执行计算
该视图位于viewFlipper布局的第四页,因此用户可能暂时不会翻转到该视图,但当他们翻转到该视图时,我希望该视图已经包含数据,这要求我具有进行计算的高度
谢谢 来自公共视图(上下文、属性集属性)构造函数文档:
当
从XML扩展视图。这是
在创建视图时调用
从XML文件构造,
提供的属性
在XML文件中指定
因此,为了实现您的需要,请为您的自定义视图提供一个将属性作为参数的构造函数,即:
public CustomView(final Context context, AttributeSet attrs) {
super(context, attrs);
String height = attrs.getAttributeValue("android", "layout_height");
//further logic of your choice..
}
那工作:)。。。您需要将“android”更改为“”
您可以使用以下选项:
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();
}
•Kotlin版本
这个问题的答案并没有完全涵盖这个问题。事实上,他们正在互相完善。为了总结答案,首先我们应该检查getAttributeValue
返回值,然后如果layout\u 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)
}
}
我尝试了attrs.getAttributeValue(“android”,“布局宽度”),结果返回null。然后我尝试了你的解决方案,它成功了。谢谢但是,对于layoutDirection属性,它仍然返回null!命名空间应该是“”(前面有http://),否则height将为null。调用
a.recycle()很重要代码>获取高度后。
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)
}
}