我创建了一个简单的视图,显示具有相同宽度和高度的按钮,并且它们与屏幕宽度相匹配。android垂直滚动条和内容不可见
当我在线性布局内使用这个视图时,它显示得很好。
我需要这是在一个垂直的布局,所以当按钮超过屏幕高度,我希望能够滚动查看更多的按钮。
但是,将此视图放入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);
}
}
请帮助,因为我感到沮丧并不知道我做错了什么。 正如我上面所写的......如果用另一个线性布局替换滚动视图,或者甚至只是将自定义视图放置在文本小部件之后,它都可以工作。
期待您的帮助,并为大量的代码和测试感到抱歉。
卡察夫
什么是的xmlns:ubergrid =“http://schemas.android.com/apk /res/com.uberaktiv.ui.layout.MetroLikeLayout“为? – Jack
Jack,这是用来定义你自己的自定义属性的一部分,你可以增强布局并提供你自己的行为,风格或其他。你可以在这里看到一个很好的例子:http://stackoverflow.com/questions/3441396/defining-custom-attrs –