在ViewGroup的子类中插入子视图而不重写onLayout()实现

时间:2016-07-02 09:45:36

标签: android android-layout android-linearlayout

背景

我正在尝试创建一个扩展LinearLayout的自定义视图。简而言之,此视图通过覆盖View.onDraw()方法来绘制自己的背景。背景周围有一个阴影(很像CardView)。

目标

由于背景就像带有阴影的卡片视图,因此不应允许子视图填充整个视图。应该为卡周围的阴影留下固定的填充。此填充不应受xml填充属性或setPadding()方法设置的填充的影响。它类似于CardView的{​​{1}}方法。

方法

我尝试通过覆盖setContentPadding()的{​​{1}}方法来实现此目的。官方文件说:

  

当此视图应为其每个子项指定大小和位置时,从布局调用。带子项的派生类应该覆盖此方法并在每个子项上调用布局。

onLayout() LinearLayout的实施效果很好。所以不想重写整个实现。因此,我尝试通过覆盖自定义类中的LinearLayout方法并更改传递给super的参数来解决阴影,如下所示:

onLayout()

问题

但问题是,这对onLayout()的孩子没有影响。无论我传给超级的是什么价值观,孩子的观点都是一样的。

问题

为什么这不起作用?或者更确切地说,为已经有@Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout( changed, left + shadowSize, top + shadowSize, right - shadowSize, bottom - shadowSize ); } 实现的LinearLayout类实现内容插入/填充的最佳方法是什么?我不想修改或重写?

1 个答案:

答案 0 :(得分:1)

它不起作用,因为width和height是为View的父级提供信息的属性。任何以layout_开头的东西都是对父母的指令。 在您的情况下,onLayout您应该布局ViewGroup的子项,而不是更改当前视图的维度。在onMeasure中,您可以测量孩子。而onLayout就是你定位他们的地方。如果你想要onLayout,你可以缩进所有孩子,但是如果你打电话给父母,你就不能这样做。 This post may help understand build custom ViewGroup 我建议您扩展ViewGroup并在自定义ViewGroup中只有一个子项,然后在调整阴影时将子项布局为与自定义视图组相同的大小。这将允许您在自定义ViewGroup上设置阴影,同时避免在边界外绘制的问题。这是最简单的方法。你可以根据需要布置每个孩子。此外,如果使用新的ConstraintsLayout是一个选项,这可能有助于防止必须使用自定义ViewGroup。