Как получить доступ к layout_height из моего пользовательского представления?

У меня есть собственное представление, и я просто хочу получить доступ к значению макета XML layout_height,

В настоящее время я получаю эту информацию и сохраняю ее во время onMeasure, но это происходит только тогда, когда представление впервые нарисовано. Мой вид - это график XY, и он должен знать его высоту как можно раньше, чтобы он мог начать выполнять вычисления.

Представление находится на четвертой странице компоновки viewFlipper, поэтому пользователь может некоторое время не переключаться на него, но когда они переключаются на него, я бы хотел, чтобы представление уже содержало данные, что требует, чтобы у меня была высота, чтобы сделать расчеты.

Спасибо!!!

3 ответа

Решение

Из открытого представления конструктора (контекстного контекста, атрибутов AttributeSet):

Конструктор, который вызывается при надувании представления из 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" на " 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..
}

Вы можете использовать это:

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();
}

Ответы, которые написаны на этот вопрос, не полностью охватывают проблему. На самом деле, они дополняют друг друга. Чтобы подвести итог ответа, сначала мы должны проверить 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)
    }
}
Другие вопросы по тегам