在我的Android Activity中,我需要在布局中的特定位置动态地(在运行时)添加单个View。要添加的视图在运行时确定。例如,布局可能看起来像这样:
<LinearLayout ...>
<TextView ... />
<!-- Dynamic item to be added here -->
<TextView ... />
</LinearLayout>
实现这一目标的最佳方法是什么?
一种解决方案是使用layout.addView(view, index)
,但我不想对索引进行硬编码。
另一个解决方案是使用FrameLayout作为占位符,并在FrameLayout中放置动态视图,例如:
<LinearLayout ...>
<TextView ... />
<FrameLayout android:id="@+id/placeholder" />
<TextView ... />
</LinearLayout>
然后:
findViewById(R.id.placeholder).addView(view);
但是,这会在层次结构中添加不必要的视图。
建议的方法是什么?
答案 0 :(得分:13)
我认为使用FrameLayout作为视图的占位符“在运行时添加”是一个很好的解决方案。
我不担心额外的“不必要”观点对绩效的影响。
答案 1 :(得分:8)
您还可以使用ViewStub
来实现此“懒惰包含”行为,如Android开发者中此(相当旧)article所述。
答案 2 :(得分:1)
您可以使用addView(View child,int index)而无需对确切索引进行硬编码。
如果可以修复其中一个视图的邻居(例如,在要插入项目的位置之前有一个特定标签),则可以获取该视图的索引,并插入动态视图之后:
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);
这样你就不会有一个巨大的视图层次结构。