Come si accede layout_height da dentro il mio visualizzazione personalizzata?
-
30-09-2019 - |
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 !!!
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)
}
}