如何从自定义视图中访问layout_height?

时间:2010-08-22 17:19:57

标签: android layout custom-view

我有自定义视图,我只想访问layout_height的xml布局值。

我目前正在获取该信息并在onMeasure期间存储它,但这仅在首次绘制视图时才会发生。我的视图是XY图,它需要尽早知道它的高度,以便它可以开始执行计算。

视图位于viewFlipper布局的第四页上,因此用户可能暂时不会翻转它,但是当它们翻转到它时,我希望视图已经包含数据,这需要我有进行计算的高度。

感谢!!!

4 个答案:

答案 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)
    }
}