2011-08-08 58 views
0

我创建了一个简单的视图,显示具有相同宽度和高度的按钮,并且它们与屏幕宽度相匹配。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); 
    } 
} 

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

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

卡察夫

+0

什么是的xmlns:ubergrid =“http://schemas.android.com/apk /res/com.uberaktiv.ui.layout.MetroLikeLayout“为? – Jack

+0

Jack,这是用来定义你自己的自定义属性的一部分,你可以增强布局并提供你自己的行为,风格或其他。你可以在这里看到一个很好的例子:http://stackoverflow.com/questions/3441396/defining-custom-attrs –

回答

0

尝试把滚动型的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> 
+0

谢谢MisterSquonk。我会尝试你的解决方案,但我担心,乍一看它可能不会。 MetroLikeLayout视图覆盖其直接的孩子,并根据计算的大小定位它们,从而实现所需的功能。我最初的想法是,我的观点会计算和尝试调整大小和重新定位scrollview而不是孩子。但是,我会尝试并可能需要更改代码。谢谢您的帮助。 –

+0

MisterSquonk,尽管我更喜欢理解我的布局设置有什么问题,但我现在想到了一个想法,我将在其中为我的自定义视图添加一个滚动视图,然后循环通过这些子项。但即使只是出于学术原因,我想知道我在上面的布局中缺少什么。 –