4

私はこれに数日間立ち往生しており、何が間違っているのか理解できません(私が見逃したばかげたものではないことを願っています).

要求事項

LinearLayout のフラグメントを含む FragmentPager があります。レイアウトには、ユーザーのナビゲーションに従って変更できるボタンとビューがあります。

GridView や ListView などのすべてのビューは完全に機能します。しかし、概念が少し異なる Fragment に適合する別のビューを作成する必要があります。高さが画面サイズよりも大きくなる可能性があるため、ビューは垂直方向にスクロール可能である必要があります。ビューがプログラムで作成されているか、.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 をオーバーライドすると、カスタム ビューに高さと幅のプロパティを使用できなくなりますが、Android がレイアウト パスを実行するときに、OnMeasure 呼び出しでより細かく制御できます。

これはすべて、次の Android ドキュメントで説明されています:カスタム コンポーネント

于 2012-08-17T11:46:38.313 に答える