4

我已经坚持了几天了,无法弄清楚我做错了什么(希望这不是我错过的愚蠢行为)。

要求

我有一个 FragmentPager,其中包含带有 LinearLayout 的片段。布局有一个按钮和一个可以根据用户导航更改的视图。

GridView 和 ListView 等所有视图都能完美运行。但我需要提出另一种适合在概念上略有不同的片段的视图。视图必须是可垂直滚动的,因为它的高度可以大于屏幕尺寸。我不在乎视图是以编程方式创建还是从 .xml 动态扩展。我尝试了这两种方法,都给出了相同的结果。

解决方案1(更可取)

我试图制作一个自定义视图并将其推送到 ScrollView 中。这是相关的.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true" >
    <com.myPackage.MyView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
</com.myPackage.MyView>
</ScrollView>

我制作了自定义视图以显示一个非常大的矩形,因此它超出了屏幕尺寸。MyView 的代码:

package com.myPackage.MyView;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class MyView extends View {
    public MyView(Context context) {
        super(context);
    }

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

    @Override
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawRect(0, 0, 100, 8000, paint);
    }
}

问题在于 ScorllView 不滚动。

我尝试删除 fillViewport (正如我在另一个答案中看到的那样),这导致根本没有显示任何内容,我还尝试在 ScrollView 内部和外部添加布局,但什么也没有。尝试所有“fill_parent”/“wrap_content”组合也会导致非滚动 ScrollView。

我究竟做错了什么?

解决方案2(不太可取)

我可以(粗暴地)将视图的概念强制到 ListView 中,它可以很好地滚动,但我无法让列表中的视图显示我的自定义视图。调试时,我注意到从未调用过 onDraw。我是否需要在其他地方实现视图的绘制,以便在 ListView 中绘制?

4

2 回答 2

1

Iain_b 是正确的,当一个视图被绘制时,它会剪裁任何不在其布局范围内的东西。对于自定义视图,这通常通过覆盖 OnMeasure 方法来完成。目前,您将自定义视图设置为 wrap_content 的高度,在您的情况下,这将导致高度为 0 的视图(它没有内容)。不幸的是,重写 OnMeasure 意味着您不能为自定义视图使用 height 和 width 属性,但是当 Android 完成布局传递时,您将在 OnMeasure 调用中获得更好的控制。

这一切都在此处的 Android 文档中进行了描述:自定义组件

于 2012-08-17T11:46:38.313 回答
1
<ScrollView>
//your textview goes here
</ScrollView>

例如,如果您有一个 TextView 并且希望它是可滚动的,那么您可以使用上面给出的 ScrollView。

确保您在 ScrollView 中仅嵌套一个 TextView

于 2017-03-16T12:34:49.133 回答