【问题标题】: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);
   }

【问题讨论】:

    标签: android view android-linearlayout


    【解决方案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 函数很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2012-01-23
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多