- 多数のViewが存在し、全てのViewが物理画面内に表示できない場合であっても、スクロールバーは自動的には表示されない。そして、物理画面に表示されていないViewは、表示されないままである。これはandroidシステムの仕様である。
- もし物理画面内に収まらないViewを表示させたいのであれば、プログラマがScrollViewを実装して、スクロールバーを使えるようにしなければならない。
- ScrollViewとは、物理画面に収まらない複数のViewを、利用者が画面をスクロールすることによって、表示できるようにするViewである。
- 文字列や画像のデータを一覧にして表示するのであれば、別の技法を用いることを検討した方が良い。例えば、GridView, ListView, Spinner等である。ScrollViewは、データでは無く、Viewを一覧表示させるものである。
- ScrollViewは縦方向のスクロールです。横方向にはHorizontalScrollViewを使う。
- スクロールさせたいViewを、ScrollViewの子として配置させて使う。ScrollViewが親になるわけです。
- 表示すべき子Viewが少量であり、物理画面内に収まる場合には、例えScrollViewを実装していたとしても、スクロールできないようになります。当たり前といえば、当たり前の仕様ですが、私はこれが気になって調べました。
- 子Viewが動的に大量になり、物理画面内に収まっていた状態から、収まらない状態へと変化した場合、スクロールできない状態からできる状態へと自動的に変化する。これの逆の状態へと子Viewが変化した場合も、スクロール状態は適切に変化する。
- ScrollViewは、FrameLayoutから派生されたクラスです。FrameLayoutでは複数のViewを子供にできますが、ScrollViewは1個の子供しか持てないようになっています。
- 普通にScrollViewを使うとすれば、子Viewは、きっとLinearLayoutでしょう。このLinearLayoutに、EditTextとかButtonとかのスクロール表示させたいViewを子供として指定します。
- ScrollViewの上(物理画面の上端)又は下(物理画面の下端)に任意のViewを表示することもできます。この場合、ScrollViewの親にRelativeLayoutを設定します。RelativeLayoutからの相対位置として、上端のView、下端のView、そして中段のScrollViewを指定します。
- smoothScrollByメソッドやfullScrollメソッド等のスクロールをさせるメソッドは、Viewが作成された後でなければ有効な実行ができません。参考:TextViewを任意の位置にスクロールさせる
- smoothScrollToメソッドは、左上端からの絶対座標を指定します。
- smoothScrollByメソッドは、現在の位置からの相対値を指定します。このため、Y軸の引数にマイナスの数値を指定すると、上方向にスクロールします。
- レイアウト間の間隔を動的に変えるにプロジェクトファイルを添付しておきました。
- ScrollViewの配下に(例え2段下であっても)ListViewを配置した場合、そのListViewのスクロールは機能しません。つまり、全然動かないので使い物にならない。
- もし、どうしてもListViewのようなViewを実装したいのであれば、LayoutInflaterを使って、同一のViewを複数表示するようにすれば良い。
- ScrollViewの配下にScrollViewを配置することは有効です。
- 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>
<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 件のコメント:
コメントを投稿