android垂直滚动条和内容不可见

时间:2011-08-08 21:10:55

标签: android user-interface view scroll

我创建了一个简单的视图,显示宽度和高度相同的按钮,它们与屏幕宽度相匹配。

当我在线性布局中使用此视图时,它显示正常。

我需要将它放在垂直布局中,所以当按钮超出屏幕高度时,我希望能够滚动查看更多按钮。

但是,将此视图放在ScrollView中会使我的窗口小部件/视图不可见。 我的布局中的某些东西可能是错误的。请帮忙。

以下是我的观点:

package com.uberaktiv.ui.layout;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

public class MetroLikeLayout extends ViewGroup {

    private static final int PADDING_TO_EDGES = 2;
    private static final int PADDING_BETWEEN_ITEMS = 4;

    private int viewWidth = 0;
    private int childControlWidth = 0;
    private int childControlHeight = 0;
    private int numberOfGridRowItems = 2;

    public MetroLikeLayout(Context context) {
        super(context, null);
    }

    public MetroLikeLayout(Context context, AttributeSet attrs) {
        super(context, attrs, 0);
    }

    public MetroLikeLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setNumberOfGridRowItems(int numGridRowItems) {
        this.numberOfGridRowItems = numGridRowItems;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
        viewWidth = parentWidth;
        childControlWidth = (viewWidth - (PADDING_TO_EDGES * 2) - (PADDING_BETWEEN_ITEMS * (numberOfGridRowItems - 1))) / numberOfGridRowItems;
        childControlHeight = childControlWidth;
        this.setMeasuredDimension(parentWidth, parentHeight);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int row = 0;
        int col = 0;
        for (int i = 0; i < getChildCount(); i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() == GONE) {
                continue;
            }
            if ((i % numberOfGridRowItems) == 0) {
                row++;
                col = 1;
            }
            int left = PADDING_TO_EDGES + ((col - 1) * (childControlWidth + PADDING_BETWEEN_ITEMS));
            int top = PADDING_TO_EDGES + ((row - 1) * (childControlHeight + PADDING_BETWEEN_ITEMS));
            child.layout(left, top, left + childControlWidth, top + childControlHeight);
            col++;
        }
    }
}

这是我的布局:

<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ubergrid="http://schemas.android.com/apk/res/com.uberaktiv.ui.layout.MetroLikeLayout">
    <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="above the table" android:layout_weight="0.0" />
    <ScrollView android:layout_width="match_parent" android:id="@+id/scrollView1" android:layout_height="fill_parent" android:layout_weight="1.0">
        <com.uberaktiv.ui.layout.MetroLikeLayout android:layout_width="fill_parent" android:layout_height="wrap_content">
            <Button android:text="Button 1" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
            <Button android:text="Button 2" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
            <Button android:text="Button 3" android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
            <Button android:text="Button 4" android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
            <Button android:text="Button 5" android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
        </com.uberaktiv.ui.layout.MetroLikeLayout>
    </ScrollView>
</LinearLayout>

主要活动是最简单的活动:

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

请帮助,因为我感到沮丧,不知道我做错了什么。 正如我上面所写的那样......如果你用另一个线性布局替换滚动视图,或者甚至只是将自定义视图放在文本小部件之后,它就会起作用。

期待您的帮助,并为大量代码和测试感到抱歉。

摩西

1 个答案:

答案 0 :(得分:0)

尝试将ScrollView放在MetroLikeLayout内围绕这样的按钮......

<com.uberaktiv.ui.layout.MetroLikeLayout android:layout_width="fill_parent" android:layout_height="wrap_content">
    <ScrollView android:layout_width="match_parent" android:id="@+id/scrollView1" android:layout_height="fill_parent" android:layout_weight="1.0">
        <Button android:text="Button 1" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
        <Button android:text="Button 2" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
        <Button android:text="Button 3" android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
        <Button android:text="Button 4" android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
        <Button android:text="Button 5" android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    </ScrollView>
</com.uberaktiv.ui.layout.MetroLikeLayout>