Domanda

Ho una visualizzazione personalizzata e ho semplicemente desiderano accedere al valore di layout XML di layout_height.

Attualmente sto ottenendo che l'informazione e la conservazione durante onMeasure, ma che accade solo quando la vista viene prima dipinto. Il mio punto di vista è una trama XY e ha bisogno di conoscere la sua altezza il più presto possibile in modo da poter iniziare i calcoli dello spettacolo.

La vista è sulla quarta pagina di un layout viewFlipper, quindi l'utente non può capovolgere per un po ', ma quando lo fanno vibrazione ad esso, desidero la vista già contiene dati, che richiede che ho l'altezza per effettuare i calcoli.

Grazie !!!

È stato utile?

Soluzione

Da pubblici View (contesto contesto, AttributeSet attrs) docs costruttore:

  

Constructor che viene chiamato quando   gonfiando una vista da XML. Questo è   chiamato quando una vista è essere   costruito da un file XML,   attributi fornitura che sono stati   specificata nel file XML.

Quindi, per ottenere quello che ti serve, fornire un costruttore alla visualizzazione personalizzata che prende attributi come parametro, cioè:.

public CustomView(final Context context, AttributeSet attrs) {
    super(context, attrs);
    String height = attrs.getAttributeValue("android", "layout_height");
    //further logic of your choice..
}

Altri suggerimenti

che il lavoro:) ... è necessario cambiare "Android" per " 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..
}

È possibile utilizzare questo:

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

Le risposte che sono scritte a questa domanda non coprono completamente il problema. In realtà, essi stanno completando l'un l'altro. Per riassumere la risposta, prima dobbiamo verificare il valore di ritorno getAttributeValue, quindi se il layout_height definita come valori delle quote, recuperarlo utilizzando 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)
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top