在添加另一个视图之前,检查布局填充器中是否存在一个视图。

6

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

  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);
   }
2个回答

17

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

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

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


太棒了,如果我这样添加,它会同时添加子视图吗? - Dnaso
@Dnaso:是的。这个方法真的应该被命名为addViewHierarchy(),但也许那样打字太多了。 :-) - CommonsWare
一个快速的问题。是否可以只取布局的一部分,比如我有几个小部件,我可以将它们放在一个布局中,然后只取需要的一部分.. 比如特殊表单,还是应该为每个小部件创建单独的XML项?@CommonsWare - Dnaso
@Dnaso:个人而言,我会为每个视图使用单独的XML布局。您可以尝试删除和添加视图。重要的是,当一个视图已经有父级时,您不能添加一个视图,因此您将从旧位置中删除并移动到新位置。 - CommonsWare

4

您可以通过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);

1
我发现indexOfChild函数很有帮助。 - Gandalf458

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接