在添加另一个视图之前检查是不是存在来自 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 的视图的主要内容,如果未能解决你的问题,请参考以下文章