在Android上看不到第二次添加视图

时间:2016-07-16 19:59:23

标签: android android-view

我有一个名为OverlayBuild的类,目的是在视图上绘制“东西”,但出于某种原因,我遇到了一个看似简单的问题,但仍然花费了我很多时间。问题是当类用于第二个(以及第3个,第4个等)时,绘图/视图不会添加到其父视图中,或者至少不可见!

我尝试简化类以确定错误的原因,但它仍然会发生。

所以这是我的OverlayBuild类的代码:

public class OverlayBuild {

    private String tag;
    private Context context;
    private ViewGroup container;
    private RelativeLayout overlay;
    public static boolean layoutLoaded;
    private int backgroundWidth     = 1500;
    private int backgroundHeight    = 1500;
    private boolean overlayLayoutCompleted;


    public OverlayBuild(Context context, ViewGroup container, String tag) {
        this.tag                        = tag;
        this.context                    = context;
        this.container                  = container;
        this.overlay                    = new RelativeLayout(context);
        layoutLoaded                    = false;
    }

    public OverlayBuild setLayoutListener(final LayoutListener layoutListener) {
        container.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (!layoutLoaded) {
                    layoutListener.layoutPrepared(container);
                    layoutLoaded = true;
                }
            }
        });

        return this;
    }
    public OverlayBuild setBackgroundDimens(int width, int height) {
        this.backgroundWidth = width;
        this.backgroundHeight = height;
        return this;
    }

    public OverlayBuild hideOverlay(){
        if(overlay != null){
            overlay.setVisibility(View.GONE);
        }
        return this;
    }


    public OverlayBuild commit() {
        View view = getViewByTag(tag);
        if (view == null) {
            container.addView(overlay);
            overlayLayoutCompleted = true;
            overlay.setTag(tag);

            overlay.bringToFront();
            overlay.setVisibility(View.VISIBLE);

            container.setBackgroundResource(R.color.red);
            overlay.setBackgroundResource(R.color.blue_mid);
        }


        return this;
    }


    private View getViewByTag(String tag) {
        return container.findViewWithTag(tag);
    }

    public interface LayoutListener {
        void layoutPrepared(ViewGroup view);
    }

以下是我使用该类“绘制”的方法:

public static void showEmptyState(final Context context, final Button createAgentBtn, final ViewGroup parentView, final String tag) {

            final OverlayBuild builder = new OverlayBuild(context, parentView, tag);
            builder.setLayoutListener(new OverlayBuild.LayoutListener() {
                @Override
                public void layoutPrepared(ViewGroup view) {
                    final ViewGroup.MarginLayoutParams btnParams = (ViewGroup.MarginLayoutParams) createAgentBtn.getLayoutParams();

                    final int parentWidth   = parentView.getWidth();
                    final int parentHeight  = parentView.getHeight();

                    builder.setBackgroundDimens(parentWidth,parentHeight)
                            .commit();
                }
            });
        }

正如您在名为“commit()”的方法中所看到的,我正在设置一些背景颜色(用于测试目的)。总之,我可以看到第一次在屏幕上看到颜色,但下次没有等等。

我已经调试了它(很多!)并且可以验证它是否到达代码中的所有位置。

2 个答案:

答案 0 :(得分:1)

我无法确定,但看起来第二次调用commit()时,视图可能不会== null。因此,视图不会再次添加,因为您的addView()调用是在空检查范围内。

您应该在启用“显示布局边界”设置的情况下测试当前代码。当视图没有按照应有的方式显示时,这对我帮助很大。 转到设置 - >开发者选项 - >启用“显示布局边界”。然后,将代码运行到应该添加第二个视图的位置,并检查是否可以看到应该添加的第二个叠加视图的布局边界。

另外,您是否尝试过不致电overlay.bringToFront();。您可能还想尝试跟踪堆叠中添加的叠加视图,并在添加/删除它们时按下/弹出。

希望这有帮助!

答案 1 :(得分:1)

我自己找到了答案。通过更改字段:

public static boolean layoutLoaded

到“非静态”:

public boolean layoutLoaded

问题解决了,因为这个布尔值只有一个实例,第二次调用时会导致状态混乱。