垂直滚动和水平滚动Android

时间:2013-04-13 05:21:24

标签: android scrollview

我有一个类来显示一个表,我希望它是水平和垂直可滚动的,我已经看到了一些解决方案,但我无法实现它们,我将我的视图放在Horizo​​ntalScrollView中,这让我做水平滚动,现在我正在尝试将Horizo​​ntalScrollView设置为ScrollView的子项。像这样的东西。

    ApuestasScoreCard draw;

    public class ApuestasScore extends Activity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);

     draw = new ApuestasScoreCard(this);
     draw.setBackgroundColor(Color.WHITE);

         ScrollView sv = new ScrollView(this)
     HorizontalScrollView hsv = new HorizontalScrollView(this);
         sv.addView(hsv);
     hsv.addView(draw);

     setContentView(hsv);
   }

然后在我的View类中,我实现了OnMeasure()方法来呈现View。我的问题是:这是一个解决方案还是我想要做的事情是不可能的。顺便说一句,当我运行这个解决方案时,logcat说:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

这是我的View类

public class ApuestasScoreCard extends View {
ApuestasScore apuestas;

public ApuestasScoreCard(Context context) {
    super(context);
    this.apuestas = (ApuestasScore) context;
    setFocusable(true);
    setFocusableInTouchMode(true);

            //..Not Important Code

 /* (non-Javadoc)
 * @see android.widget.HorizontalScrollView#onMeasure(int, int)
 */
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // TODO Auto-generated method stub
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int width = MeasureSpec.getSize(widthMeasureSpec+2000);
        int height = MeasureSpec.getSize(heightMeasureSpec+500);
        setMeasuredDimension(width, height);

}

    @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    width = w / 26f;
    height = h / 29f;
    width2 = w / 6.5f;
    height2 = h / 5f;
    getRect(selX, selY, selRect);

    super.onSizeChanged(w, h, oldw, oldh);
}

    @Override
protected void onDraw(Canvas canvas) {
    // Draw the background...FFFF00 23F607



            for (int i = 0; i < 29; i++) {
                if (i < 3) {
                    canvas.drawLine(0, i * height, getWidth(), i * height, light);// Horizontales

                    canvas.drawLine(0, i * height + 1, width * 2, i * height + 1,
                            hilite);
                }
                if (i == 2 || i == 5 || i == 8 || i == 11 || i == 14 || i == 17
                        || i == 20 || i == 23 || i == 26 || i == 29) {
                    canvas.drawLine(0, i * height, getWidth(), i * height, dark);// Horizontales

                    canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1,
                            hilite);
                }
            }
            for (int i = 0; i < 29; i++) {

                canvas.drawLine(width * 2, i * height, getWidth() + 100,
                        i * height, light);// Horizontales

                canvas.drawLine(width * 2, i * height + 1, getWidth() + 100, i
                        * height + 1, hilite);

                if (i > 1 && i < 12) {
                    canvas.drawLine(i * width, 0, i * width, getHeight(), light);

                    canvas.drawLine(i * width + 1, 0, i * width + 1, getHeight(),
                            hilite);
                }
    }

}
    }

4 个答案:

答案 0 :(得分:1)

谢谢,我找到了解决方案,必须按此顺序:

ScrollView sv = new ScrollView(this);
HorizontalScrollView hsv = new HorizontalScrollView(this);
hsv.addView(sv);
sv.addView(draw);

setContentView(hsv);

答案 1 :(得分:1)

我知道这篇文章很老但是由于我无法在其他地方找到解决方案并且必须自己做,我决定分享我的解决方案,我为此制作了一个自定义组件,随意使用它:

https://gist.github.com/androidseb/9902093

答案 2 :(得分:0)

请发布您的布局文件。

发生了什么我认为您已经在 ScrollView 中添加了一个孩子。现在ScrollView只能包含一个子节点,它可以是另一个容器,而后者又可以包含其他视图。

您可以做的是从 ScrollView 中移除所有孩子,然后添加 Horizo​​ntalScrollView ,其中已添加了子项(到HSV)。

查看ScrollView&amp;的文档。 HorizontalScrollView

答案 3 :(得分:0)

在xml中采用水平滚动视图后,在一个布局中以线性或相对方式覆盖此水平滚动视图,然后将垂直滚动视图放在xml中,这样最终您可以在水平和垂直方向上移动xml。试试吧。