Android布局占位符用于dynamic添加视图

在我的Android活动中,我需要dynamic地(在运行时)在布局中的特定位置添加一个视图。 要添加的视图在运行时确定。 例如,可能布局可能看起来像这样:

<LinearLayout ...> <TextView ... /> <!-- Dynamic item to be added here --> <TextView ... /> </LinearLayout> 

达到这个目标的最好方法是什么?

一个解决scheme是使用layout.addView(view, index) ,但我不想硬编码索引。

另一个解决scheme是使用FrameLayout作为占位符,并且可以在FrameLayout中放置dynamic视图,例如:

 <LinearLayout ...> <TextView ... /> <FrameLayout android:id="@+id/placeholder" /> <TextView ... /> </LinearLayout> 

然后:

 findViewById(R.id.placeholder).addView(view); 

但是,这在层次结构中添加了不必要的视图。

推荐的方法是什么?

Solutions Collecting From Web of "Android布局占位符用于dynamic添加视图"

我认为使用FrameLayout作为视图的占位符“在运行时添加”是一个很好的解决scheme。

我不会担心额外的“不必要的”观点对绩效的影响。

您也可以通过使用ViewStub实现这种“懒惰包含”行为,如Android开发人员的这篇(相当古老的) 文章中所述 。

你可以使用addView(View child,int index)而不用硬编码确切的索引。

如果其中一个视图的邻居可以被修复(例如,在要插入项目的位置之前有一个特定标签),则可以获取该视图的索引,然后插入dynamic视图:

 View previousView = findViewById(ID_OF_PREVIOUS_VIEW); ViewGroup parent = (ViewGroup)previousView.getParent(); int previousIndex = parent.indexOfChild(previousView); parent.addView(theDynamicallyCreatedView, previousIndex + 1); 

或者你可以使用ViewStub,而不是膨胀一个布局,只是删除它:

 View placeholder = findViewById(ID_OF_STUB); ViewGroup parent = (ViewGroup)previousView.getParent(); int index = parent.indexOfChild (placeholder); parent.removeViewAt(index); parent.addView(theDynamicallyCreatedView, index); 

这样你就不会得到一个巨大的视图层次结构。