我有一个名为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()”的方法中所看到的,我正在设置一些背景颜色(用于测试目的)。总之,我可以看到第一次在屏幕上看到颜色,但下次没有等等。
我已经调试了它(很多!)并且可以验证它是否到达代码中的所有位置。
答案 0 :(得分:1)
我无法确定,但看起来第二次调用commit()
时,视图可能不会== null
。因此,视图不会再次添加,因为您的addView()
调用是在空检查范围内。
您应该在启用“显示布局边界”设置的情况下测试当前代码。当视图没有按照应有的方式显示时,这对我帮助很大。 转到设置 - >开发者选项 - >启用“显示布局边界”。然后,将代码运行到应该添加第二个视图的位置,并检查是否可以看到应该添加的第二个叠加视图的布局边界。
另外,您是否尝试过不致电overlay.bringToFront();
。您可能还想尝试跟踪堆叠中添加的叠加视图,并在添加/删除它们时按下/弹出。
希望这有帮助!
答案 1 :(得分:1)
我自己找到了答案。通过更改字段:
public static boolean layoutLoaded
到“非静态”:
public boolean layoutLoaded
问题解决了,因为这个布尔值只有一个实例,第二次调用时会导致状态混乱。