2011年9月8日木曜日

ScrollViewに関するメモ

ScrollViewに関するメモ

  1. 多数のViewが存在し、全てのViewが物理画面内に表示できない場合であっても、スクロールバーは自動的には表示されない。そして、物理画面に表示されていないViewは、表示されないままである。これはandroidシステムの仕様である。
  2. もし物理画面内に収まらないViewを表示させたいのであれば、プログラマがScrollViewを実装して、スクロールバーを使えるようにしなければならない。
  3. ScrollViewとは、物理画面に収まらない複数のViewを、利用者が画面をスクロールすることによって、表示できるようにするViewである。
  4. 文字列や画像のデータを一覧にして表示するのであれば、別の技法を用いることを検討した方が良い。例えば、GridView, ListView, Spinner等である。ScrollViewは、データでは無く、Viewを一覧表示させるものである。
  5. ScrollViewは縦方向のスクロールです。横方向にはHorizontalScrollViewを使う。
  6. スクロールさせたいViewを、ScrollViewの子として配置させて使う。ScrollViewが親になるわけです。
  7. 表示すべき子Viewが少量であり、物理画面内に収まる場合には、例えScrollViewを実装していたとしても、スクロールできないようになります。当たり前といえば、当たり前の仕様ですが、私はこれが気になって調べました。
  8. 子Viewが動的に大量になり、物理画面内に収まっていた状態から、収まらない状態へと変化した場合、スクロールできない状態からできる状態へと自動的に変化する。これの逆の状態へと子Viewが変化した場合も、スクロール状態は適切に変化する。
  9. ScrollViewは、FrameLayoutから派生されたクラスです。FrameLayoutでは複数のViewを子供にできますが、ScrollViewは1個の子供しか持てないようになっています。
  10. 普通にScrollViewを使うとすれば、子Viewは、きっとLinearLayoutでしょう。このLinearLayoutに、EditTextとかButtonとかのスクロール表示させたいViewを子供として指定します。
  11. ScrollViewの上(物理画面の上端)又は下(物理画面の下端)に任意のViewを表示することもできます。この場合、ScrollViewの親にRelativeLayoutを設定します。RelativeLayoutからの相対位置として、上端のView、下端のView、そして中段のScrollViewを指定します。
  12. smoothScrollByメソッドやfullScrollメソッド等のスクロールをさせるメソッドは、Viewが作成された後でなければ有効な実行ができません。参考:TextViewを任意の位置にスクロールさせる
  13. smoothScrollToメソッドは、左上端からの絶対座標を指定します。
  14. smoothScrollByメソッドは、現在の位置からの相対値を指定します。このため、Y軸の引数にマイナスの数値を指定すると、上方向にスクロールします。
  15. レイアウト間の間隔を動的に変えるにプロジェクトファイルを添付しておきました。
  16. ScrollViewの配下に(例え2段下であっても)ListViewを配置した場合、そのListViewのスクロールは機能しません。つまり、全然動かないので使い物にならない。
  17. もし、どうしてもListViewのようなViewを実装したいのであれば、LayoutInflaterを使って、同一のViewを複数表示するようにすれば良い。
  18. ScrollViewの配下にScrollViewを配置することは有効です。
  19. Android 4.4.2 (API 19)において、画面を4~5回上下にスクロールさせると、画面が動かなくなる。原因不明。対応措置無し。このため、ListViewで代替することになる。このListViewのAddHeaderViewにView群を挿入してやれば良い。ただし、何かダミーをList要素に入れてやらないと、HeaderViewは表示されない。空っぽのアダプターを作ってsetAdapter()すれば良い。Android Studio: Horizonal Scroll View Freezes While Testing On Emulator

上記知見を得るために使用したxmlを掲載しておきます。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <TextView
        android:id="@+id/TopView"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/ThisIs"
        android:layout_alignParentTop="true"
        >
    </TextView>
    <TextView
        android:id="@+id/BottomView"
        android:text="@string/ThisIs"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true"
        >
    </TextView>
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_above="@id/BottomView"
        android:layout_below="@id/TopView"
        >
        <LinearLayout
            android:id="@+id/LLParent"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            >
            <LinearLayout
                android:id="@+id/LLButtonReportSize"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:layout_gravity="center_vertical"
                android:tag="padding"
                >
                <Button
                    android:layout_width="wrap_content" 
                    android:layout_height="wrap_content" 
                    android:text="@string/ThisIs"
                    >
                </Button>
            </LinearLayout>
            <Button
                android:id="@+id/ButtonReportSize"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:text="@string/ThisIs"
                >
            </Button>
            
            <LinearLayout
                android:id="@+id/LLToggleButton"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:layout_gravity="center_vertical"
                android:tag="padding"
                >
                <ToggleButton
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    >
                </ToggleButton>
            </LinearLayout>
            <ToggleButton
                android:id="@+id/toggleButtonPadding"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                >
            </ToggleButton>
            
            <LinearLayout
                android:id="@+id/LLCheckBox"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:layout_gravity="center_vertical"
                android:tag="padding"
                >
                <CheckBox
                    android:text="@string/ThisIs"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    >
                </CheckBox>
            </LinearLayout>
            <CheckBox
                android:id="@+id/checkBox"
                android:text="@string/ThisIs"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                >
            </CheckBox>
            
            <SeekBar
                android:id="@+id/seekBar1"
                android:layout_height="wrap_content"
                android:layout_width="fill_parent"
                >
            </SeekBar>
            <RatingBar
                android:id="@+id/ratingBar1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                >
            </RatingBar>
            <RatingBar
                android:id="@+id/ratingBar1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                >
            </RatingBar>
        </LinearLayout>
    </ScrollView>
</RelativeLayout>

0 件のコメント:

コメントを投稿