2013-02-14 98 views
0

我写了一个自定义视图,它重写onMeasure()和onLayout()来完成非常特定的任务,而忽略了某些属性,如layout_height和layout_width。因为指定这些属性不再有意义,所以我想在我的布局XML中省略它们。但是,如果我这样做,我得到异常说的属性是必需的:以编程方式添加到自定义视图中的AttributeSet

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

是否有不再需要某些必需的属性什么办法?

我打算尝试在我的视图的构造函数中以编程方式添加这些属性,但AttributeSet似乎只有检索值的方法,没有设置它们。我研究了是否可以使用attrs.xml找到解决方案,但没有看到任何有希望的东西。想法?

+0

为什么你不能简单地使用这些属性(无论你想要什么值),并忽略它们,如果你不需要它们? – Luksprog 2013-02-15 17:57:18

+0

我可以(而且)但我宁愿避免指定完全忽略的“必需”属性的混乱。它似乎有一个用例。例如,Android的SlidingDrawer也不尊重高度和宽度。所以我很好奇,如果Android提供了一种方法来省略通常(但并非总是)所需的标准属性。它似乎不,但我认为这是值得问。 – spaaarky21 2013-02-15 18:39:04

+0

'SlidingDrawer'不尊重高度和宽度,但它需要**这些属性出现(所以你可以看到SDK工程师解决你所面临的问题的方式)。无论如何,这个检查是在视图的LayoutParams被构建的时候完成的,所以你可以做的事情不多(并且这不值得花费精力)。 – Luksprog 2013-02-15 19:25:06

回答

0

为了解决这个问题,我将继续总结迄今为止所进行的讨论,以及一些其他的见解。

简而言之,应该始终设置layout_width和layout_height,而不管它们是否被它们设置的View所尊重。即使由Android提供的忽略这些属性的Views仍然需要在布局XML中设置它们。

当布局膨胀时,自定义视图会在引发验证异常之前构造。当我记录提供给View的构造函数的AttributeSet类时,我发现它是一个XmlBlock $ Parser。我相信我可以通过强制AttributeSet并调用setProperty()来设置一个虚拟的layout_height和layout_width值,从而允许验证成功,而无需在XML中指定这些属性。 但是,该方法假定所提供的AttributeSet始终是一个特定的实现,在所有情况下以及Android的所有版本中。

+0

除GridLayout的子项外。在那里,视图不需要layout_width或layout_height。我花了一段时间才看到自己的内部“layout_width/height”缺失警报。 – lilbyrdie 2013-07-26 01:35:24

相关问题