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



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

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

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

建议的方法是什么?

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

我不会担心额外的"不必要"观点对性能的影响。

您还可以通过使用ViewStub来实现这种"惰性包含"行为,如Android Developers的这篇(相当古老的)文章中所述。

您可以使用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);

这样就不会产生巨大的视图层次结构。

最新更新