Как получить доступ к layout_height из моего пользовательского представления? - PullRequest
7 голосов
/ 22 августа 2010

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

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

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

Спасибо !!!

Ответы [ 4 ]

12 голосов
/ 21 августа 2012

, которые работают:) ... вам нужно изменить "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..
}
4 голосов
/ 02 января 2015

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

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();
}
4 голосов
/ 22 августа 2010

Из публичное представление (контекстный контекст, атрибуты 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..
}
0 голосов
/ 30 мая 2019

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