Android自定义视图组委托addView

我希望在我的案例中实现从FrameLayout派生的自定义ViewGroup,但我希望从xml添加的所有子视图不是直接添加到此视图中,而是添加到此自定义ViewGroup中包含的FrameLayout中.
让我举例说明一下.

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical">
    <FrameLayout
        android:id="@+id/frame_layout_child_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <FrameLayout
        android:id="@+id/frame_layout_top"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</merge>

我想将所有子视图重定向到带有帧frame_layout_child_container的FrameLayout.

所以当然我像这样覆盖方法addView()

  @Override
    public void addView(View child) {
        this.mFrameLayoutChildViewsContainer.addView(child);
    }

但是可以肯定这不起作用,因为此时mFrameLayoutChildViewsContainer没有添加到根自定义视图中.

我的想法是始终在此容器frame_layout_top的顶部保留一些视图,并且添加到自定义组件中的所有子视图应该转到frame_layout_child_container

使用自定义视图的示例

   <CustomFrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"/>
    </CustomFrameLayout>

因此,在这种情况下,应将TextView添加到frame_layout_child_container中

是否可以委托将所有视图添加到子ViewGroup中,就像我描述的那样.

我有其他想法,比如每次添加视图时使用bringToFront()方法以保持正确的z轴顺序,或者例如添加视图时,将其保存到数组,而不是在自定义视图膨胀之后将所有视图添加到此子框架FrameLayout

建议在这种情况下做什么,以便在每次添加新视图时都不会通过重新填充所有布局来达到性能,如果可以以其他方式实现的话.

从布局中膨胀的视图(如示例TextView)不会使用addView(View子句)添加到其父ViewGroup中,这就是为什么覆盖该方法不适合您.你想要覆盖addView(View子,int索引,ViewGroup.LayoutParams参数),所有其他addView()重载最终调用.

在该方法中,检查正在添加的子项是否是您的两个特殊FrameLayouts之一.如果是,让超类处理添加.否则,将子项添加到容器FrameLayout.

public class CustomFrameLayout extends FrameLayout {

    private final FrameLayout topLayout;
    private final FrameLayout containerLayout;

    ...

    public CustomFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        LayoutInflater.from(context).inflate(R.layout.custom, this, true);
        topLayout = (FrameLayout) findViewById(R.id.frame_layout_top);
        containerLayout = (FrameLayout) findViewById(R.id.frame_layout_child_container);
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        final int id = child.getId();
        if (id == R.id.frame_layout_top || id == R.id.frame_layout_child_container) {
            super.addView(child, index, params);
        }
        else {
            containerLayout.addView(child, index, params);
        }
    }
}
https://stackoverflow.com/questions/36946173/android-custom-view-group-delegate-addview

转载注明原文:Android自定义视图组委托addView