10

カスタムビューがあり、xmlレイアウト値のにアクセスしたいだけですlayout_height

現在、その情報を取得してonMeasure中に保存していますが、これはビューが最初にペイントされたときにのみ発生します。私のビューはXYプロットであり、計算の実行を開始できるように、できるだけ早くその高さを知る必要があります。

ビューはviewFlipperレイアウトの4ページ目にあるため、ユーザーはしばらくはめくらないかもしれませんが、めくったときに、ビューにすでにデータが含まれている必要があります。計算を行います。

ありがとう!!!

4

4 に答える 4

14

その作品:)...「 http://schemas.android.com/apk/res/android」の「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..
}
于 2012-08-21T05:04:51.473 に答える
7

あなたはこれを使うことができます:

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();
}
于 2015-01-02T00:08:20.677 に答える
5

public View(Context context、AttributeSet attrs)コンストラクタードキュメントから :

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..
}
于 2010-08-22T17:27:04.293 に答える
3

••Kotlin Version

この質問に書かれている答えは、問題を完全に網羅しているわけではありません。実際、彼らはお互いを完成させています。答えを要約するには、最初に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)
    }
}
于 2019-05-30T08:20:29.977 に答える