在添加另一个视图之前检查是不是存在来自 layoutinflater 的视图

Posted

技术标签:

【中文标题】在添加另一个视图之前检查是不是存在来自 layoutinflater 的视图【英文标题】:check to see if a view exists from a layout inflater befor adding another one在添加另一个视图之前检查是否存在来自 layoutinflater 的视图 【发布时间】:2013-12-06 20:12:54 【问题描述】:

在我的 android 项目中,我动态地将表单添加到我的线性布局中,然后在完成按钮后销毁它们。但是,当我单击“添加按钮”时,它会无限添加更多表单,尽管我一次只想要一个。我如何检查我的linearLayout“帐户”是否已添加到视图中,或者它当时是否存在于视图中?这是添加视图的代码。在添加视图之前如何检查视图是否已经存在?

  public void showForm(String form)
        View view;
        LayoutInflater inflater    
          =(LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.forms, null);
        LinearLayout item = (LinearLayout) view.findViewById(R.id.accounts);
        l.addView(item);
   

【问题讨论】:

【参考方案1】:

选项#1:使用boolean accountsAdded=false;,在需要时将其设置为true

选项 #2:使用 l.findViewById(R.id.accounts) 并查看是否返回 null

顺便说一句,如果R.layout.forms 的根小部件不是R.id.accounts View,您将会崩溃,所以请通过addView()view,而不是item 添加到l

【讨论】:

太棒了,如果我这样添加,它会添加子视图吗? @Dnaso:是的。该方法确实应该命名为addViewHierarchy(),但也许输入太多了。 :-) 一个简单的问题。是否可以只取布局的一部分,比如说我有几个小部件,我可以将它们放在一个布局中,然后在需要时取其中的一部分。IE 特殊表单还是应该为每个小部件创建单独的 XML 项目? @CommonsWare @Dnaso:我个人会为每个人使用单独的 XML 布局。欢迎您尝试删除和添加视图。最重要的是,当视图已经有父视图时,您无法添加视图,因此您将从旧位置移除并移动到新位置。【参考方案2】:

您可以通过 ViewGroup indexOfChild(View view) 方法检查孩子是否存在。它返回一个正整数,表示视图在组中的位置,如果视图不存在于组中,则返回 -1

ViewGroup rootLayout = (ViewGroup) getWindow().peekDecorView();
LayoutInflater li = LayoutInflater.from(this);
View myView= li.inflate(R.layout.recorder, null);
if(rootLayout.indexOfChild(myView) == -1)
    rootLayout.addView(myView);

【讨论】:

我发现 indexOfChild 函数很有帮助

以上是关于在添加另一个视图之前检查是不是存在来自 layoutinflater 的视图的主要内容,如果未能解决你的问题,请参考以下文章

使用来自另一个散列的值作为散列名称检查散列中是不是存在键

在搜索值之前检查视图中是不是存在列

如何在创建存储过程之前检查它是不是存在

检查来自另一个 ViewController 的按钮

如何检查子视图控制器是不是存在

在插入表之前检查数据是不是存在