Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从自定义视图中访问布局高度?_Android_Android Layout_Layout_Custom View - Fatal编程技术网

Android 如何从自定义视图中访问布局高度?

Android 如何从自定义视图中访问布局高度?,android,android-layout,layout,custom-view,Android,Android Layout,Layout,Custom View,我有一个自定义视图,我只想访问xml布局值layout\u height 我目前正在获取这些信息,并在onMeasure期间存储这些信息,但只有在首次绘制视图时才会发生这种情况。我的视图是XY图,它需要尽早知道其高度,以便开始执行计算 该视图位于viewFlipper布局的第四页,因此用户可能暂时不会翻转到该视图,但当他们翻转到该视图时,我希望该视图已经包含数据,这要求我具有进行计算的高度 谢谢 来自公共视图(上下文、属性集属性)构造函数文档: 当 从XML扩展视图。这是 在创建视图时调用 从X

我有一个自定义视图,我只想访问xml布局值
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)
    }
}