首页 文章

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

提问于
浏览
20

在我的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 回答

  • 8

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

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

  • 13

    您还可以使用 ViewStub 来实现此"lazy include"行为,如Android开发者中此(相当旧)article所述 .

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

    这样您就不会得到巨大的视图层次结构 .

相关问题