0

私は、layout_heightやlayout_widthなどの特定の属性を無視して、非常に特定のタスクを実行するためにonMeasure()とonLayout()をオーバーライドするカスタムビューを作成しました。これらの属性を指定することはもはや意味がないため、レイアウトXMLではそれらを省略したいと思います。しかし、そうすると、属性が必要であるという例外が発生します。

RuntimeException: Binary XML file line #49: You must supply a layout_width attribute.

特定の必須属性を不要にする方法はありますか?

ビューのコンストラクターでこれらのプロパティをプログラムで追加しようとしましたが、AttributeSetには値を取得するためのメソッドしかなく、値を設定することはできないようです。attrs.xmlを使用して解決策を見つけることができるかどうかを調べましたが、有望なものは何も見つかりませんでした。アイデア?

4

1 に答える 1

0

この質問を締めくくるために、これまでに行われた議論をいくつかの追加の洞察とともに要約します。

簡単に言うと、layout_widthとlayout_heightは、設定されているビューによって尊重されているかどうかに関係なく、常に設定する必要があります。これらの属性を無視するAndroidが提供するビューでも、レイアウトXMLで設定する必要があります。

レイアウトが拡張されると、検証例外がスローされる前にカスタムビューが構築されます。ビューのコンストラクターに提供されたAttributeSetのクラスをログに記録すると、それがXmlBlock$Parserであることがわかります。AttributeSetをキャストしてsetProperty()を呼び出すことで、ダミーのlayout_heightとlayout_widthの値を設定でき、XMLでこれらの属性を指定しなくても検証を成功させることができると思います。 ただし、このアプローチでは、Androidのすべての状況とすべてのバージョンで、提供されるAttributeSetが常に特定の実装であると想定しています。

于 2013-03-04T06:33:41.800 に答える