Android ViewParent 一定是 Viewgroup 吗?

Is an Android ViewParent guaranteed to be a Viewgroup?

是否存在 View.getParent() returns 不是 ViewGroup 类型的对象的实际情况?或者我可以像下面的代码示例一样安全地转换它而不先检查它的类型吗?

 if (getParent() == null){
     throw new IllegalStateException("View does not have a parent, it cannot be rootview!");
 }
 ViewGroup parent = (ViewGroup) getParent();

很安全。在 Android SDK 中,ViewParent 的每个实现都是 ViewGroup.

但请记住 instanceof 也会检查是否为空。你可以写:

if (!(getParent() instanceof ViewGroup)){
  throw new IllegalStateException("View does not have a parent, it cannot be rootview!");
}
ViewGroup parent = (ViewGroup) getParent();

如果比较 ViewGroup and ViewParent 的直接子类和间接子类,它们看起来是一样的(考虑 ViewGroup 本身)。

仍然有可能在某些自定义库中,您可能会从 getParent() 获得一个 ViewParent 而不是 ViewGroup。这是真实案例吗?

所以
- 如果您不能确定父类型,您最好检查一下。
- 在普通应用程序中,您通常了解什么是父级或可以是什么 - 因此您可以跳过检查

如果你没有做任何花哨的事情,那应该是安全的。唯一不安全的情况是当您到达视图层次结构的根目录时。然后 ViewParent 将是 ViewRootImpl