检查视图元素是否以编程方式添加到布局中

Mel*_*lon 30 performance android android-emulator android-intent android-layout

在我的fragment类中,我有条件地以编程方式将子视图元素添加到我的布局中:

LinearLayout child = (LinearLayout) inflater.inflate(R.layout.child_view, null);

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,100);

container.addView(child, params);
Run Code Online (Sandbox Code Playgroud)

由于上面的代码将有条件地运行,所以,在某些时候,我想检查子视图是否已添加,如何以编程方式进行此检查?

coo*_*rok 43

如果您通过inflater创建视图,则可以检查其父级

if(view.getParent() != null) {...}
Run Code Online (Sandbox Code Playgroud)


App*_*ide 25

我想你可以简单地使用

findViewById(your_view_id) 
Run Code Online (Sandbox Code Playgroud)

method:如果结果为null,则视图不存在,否则视图存在

  • 这是一个非常繁重的计算,因为它必须遍历视图组下方视图的层次结构,这可能是大量的视图.另一个答案.getParent()是一个字段查找 (4认同)
  • 你读过我在评论中添加的链接了吗?第一段说明:"你的代码可能会在滚动ListView期间经常调用findViewById(),这会降低性能.即使适配器返回一个膨胀的视图进行回收,你仍然需要查找元素并更新重复使用findViewById()的方法是使用"视图持有者"设计模式."** (3认同)

imt*_*iga 23

很抱歉迟到的回复,但您可以尝试这个替代方案:

container.getChildCount();在添加视图之前和添加视图之后使用.喜欢 :

int x = container.getChildCount();

container.addView(child, params);

int y = container.getChildCount();

if(y > x)
   Toast.makeText(context, "View Successfully Added!", Toas.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)


Zon*_*Zon 12

或者,如果您要查找视图实例,则可以:

if (container.indexOfChild(childView) == -1) {
  // Add child to container.
}
Run Code Online (Sandbox Code Playgroud)


int*_*_32 8

有了AndroidX您就可以使用ViewGroup.contains(view: View): Boolean扩展功能。


kta*_*mas 6

我不能写评论所以我把它写在这里作为一个解决方案:从API级别19你可以调用isAttachedToWindow()哪个没有多大帮助,但如果你瞄准API 19或更高,那么这应该由文档工作.