查看与可见性状态GONE占用屏幕上的空间

时间:2011-02-04 14:57:01

标签: android android-widget android-layout

我遇到的问题是,可见性状态为GONE的视图会(不合需要地)占用屏幕上的空间。始终在API级别< = 7设备上出现此问题,但最近仅在8个以上的设备上发生(在我使用AsyncTasks填充某些字段后,按照Show a progress bar when an Activity is loading

一点背景: 我创建了一个自定义视图,扩展了LinearLayout,其中包含一个“标题”按钮和(用户定义;在某些情况下,它是一些TextViews,在其他情况下,它是TableLayouts)“内容”。这个视图的目的是切换内容点击标题按钮的内容(我不相信有一个内置的小部件...我可能是错的。)

在onLayout()中,我第一次绘制时,将标题设置为GONE以外的所有子视图的可见性状态:

protected void onLayout(boolean changed, int l, int t, int r, int b) {
    if(initialDraw) {
        setContentsVisible(false);
        initialDraw = false;
    }
    super.onLayout(changed, l, t, r, b);
}

public void setContentsVisible(boolean visible) {
    for(int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);

        if(child != mTitle) {
            child.setVisibility(visible ? VISIBLE : GONE);
        }
    }
}

3 个答案:

答案 0 :(得分:1)

将代码从onLayout()移动到onMeasure()可以解决问题。

答案 1 :(得分:0)

确定。我不明白它在你的情况下是如何吸取任何东西的。但我认为你应该在检查后调用super.onLayout()。像这样:

protected void onLayout(boolean changed, int l, int t, int r, int b) {
    if(initialDraw) {
        setContentsVisible(false);
        initialDraw = false;
    }
    super.onLayout(l,t,r,b);
}

LinearLayout决定如何在onLayout()中布置它的子项(垂直或水平),你没有调用它。更重要的是,在选择之后,它实际上开始计算如何布置每个孩子,如果孩子的可见性是GONE,它会跳过它(意味着孩子不会占用任何空间)。 我认为在你的情况下,根本没有孩子会被安排和展示,但我可能在某个地方出错了。

答案 2 :(得分:0)

我怀疑你的生活变得不必要了。使视图的可扩展部分(具有少量TextViews或TableLayouts的非标题位)属于单个容器视图 - FrameLayout似乎是一个可能的选择 - 并且只需在其上调用setVisibility()

不需要循环,你肯定不想从onLayout()中做到这一点......只需从你的标题onClick()进行。