Android布局占位符,用于动态添加视图

时间:2012-04-02 11:24:36

标签: android android-layout

在我的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);

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

建议的方法是什么?

3 个答案:

答案 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);

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